2011-01-03 5 views
12

나는 DownloadManager의 디자인을해야하지만 내 주요 질문은 어떻게 든 DownloadManager이를받을 수있는 Download 등 진행률 표시 줄, onError(), onFinish()를 업데이트 할 onUpdate() 같은 DownloadManager에게 보낼 수있는 알림 관련이있다 Download에서 알림.옵저버 패턴 또는 콜백?

  • 옵저버 패턴
  • 콜백

옵저버 패턴

기본적으로 1 관찰 가능한 및 N 관찰자가 :

나는 두 가지 방법을 생각했습니다. 필자의 경우 DownloadManager는 Observer가되고 Observables는 다운로드됩니다. 따라서 N Observables 1 Observer라는 관계가 있습니다.

장점은 가능한 한 모든 알림을 Observers의 notify() 또는 update() (java의) 메소드에 집중시키는 것입니다. 제 경우에는 DownloadManager 만 있습니다. 알림 코드를 사용하여 notify() 메서드에 매개 변수를 전달할 수 있습니다.

단점? 나는 콜백으로 쉽게 할 수있는 일에 oop 패턴을 사용하고있다. 또한, N observables 1 observer 그것은 1 명의 관찰 가능한 N 관찰자에 대해 수행 되었기 때문에 적어도 관찰자 패턴과 관련하여 이상한 것입니다. 따라서 실제로 관찰자 패턴을 사용하지 않을 것입니다.

관찰자 패턴과 매우 유사

콜백. DownloadManager는 "리스너"(인터페이스)를 구현합니다. 이 리스너는 onFinish(), onUpdate() 등의 알림 함수를 구현합니다. 그런 다음이 리스너는 모든 다운로드에 등록되어야하므로 다운로드가 완료되면 listener.onFinish()이 호출됩니다. 또한 관측자 패턴처럼 다운로드에서이 메서드에 매개 변수를 전달할 수 있습니다.

장점 : 쉽게 사용할 수 있습니다. 단점 : 없음.

내 의견으로는 1 명의 관찰자 N 관찰자에 대해 관찰자 패턴을 사용하는 것이 바람직하지 않기 때문에 아마 콜백을 사용할 것입니다.

그리고 어떤 옵션을 사용할 수 있습니까?

+1

"콜백 : 장점 : 쉽게 사용할 수 있습니다. 단점 : 없음" 나는 네가 네 답을 찾은 것 같아. –

+0

콜백을 사용하는 한 가지 단점은 프로그램의 결합을 증가 시킨다는 것입니다 (일반적으로 새로운 매개 변수를 사용하는 모든 함수에 새 매개 변수가 추가됨). – synack

+0

다른 상태 변경 업데이트의 편의를 위해 Observer 디자인 패턴을 여러 번 (오버로드 된 것과 비슷한) 업데이트 (Observable o, Object arg) 메서드로 여기에서 다시 설명했던 콜백이라고 생각합니다. –

답변

3

콜백 FTW. 더 간단하고 대부분의 경우 단순성은 개발, 디버깅, 최적화, 문서화 및 추가 유지 관리를 포함하여 프로젝트의 모든 측면에 긍정적 인 영향을 미칩니다.

+2

5 년 후 ... "올바른 길"은 옵서버 패턴 인 것 같습니다. 대부분의 자바 스크립트 API를 살펴보십시오 : Promises가 콜백을 대체하고 있습니다. Angular 2를 살펴보십시오 : 그들은 Observables의 Callbacks와 Promises를 대체했습니다. 콜백은 쉽지만 장기적으로는 좋은 선택이 아닙니다. – CedX

3

관측자는보다 유연하고 확장 가능합니다. 관찰자 패턴에 대해 언급 한 모든 사용법이 이상한 것은 아닌지. Patters는 모든 guidlines 이후에 있습니다. 필요에 맞게 조금 변경해야한다면 간다.

DownloadManagers이 여러 개인 경우를 고려해보십시오 (특정 상황에 맞는 유스 케이스가 아닐 수도 있음). 둘 다 등록해야합니다. 당신이 더 많은 것을 가지고 있다면 당신은 그들 모두를 등록해야 할 것입니다.꽤 긴 목록 플러스 Download

+0

사실 내 DownloadManager는 싱글 톤입니다. 내 응용 프로그램에는 단 하나의 인스턴스 만 있습니다. –

4

Observer/Callback 접근과 반대되는 옵션이 있습니다. DownloadManager 명의 고객을 소극적인 플레이어에서 적극적인 플레이어로 전환시킬 수 있습니다. 관리자로부터 메시지를 기다리는 대신 정기적으로 상태를 요청할 것입니다.

이렇게하면 다운로드 프로세스가 최종 사용자에게 훨씬 더 부드럽게 보입니다. 그리고 당신은 그것을 더 잘 제어 할 수있을 것입니다.

물론 두 개의 스레드를 사용해야합니다. 또는 DownloadManager에게 깨지기 쉬운 작업을 실행하는 대신 클라이언트에 제어권을 반환하는 작은 단계로 작업하도록 교육해야합니다.

3

옵저버이 더 적합합니다. Manager가 많은 인스턴스에 요청을 보내야하기 때문입니다.

구현하기 쉽습니다. 구현 지점에서 진행률 표시 줄 기능 및 각 다운로드 방법에 대한 확장 성이 향상됩니다.