2011-06-29 9 views
5

オブザーバーのデザインパターンに関して読んだ参考書(GOFデザインパターン、ヘッドファーストデザインパターン、http://www.dofactory.com/Patterns/PatternObserver.aspx)は、具体的な被験者が具体的なオブザーバーへの参照を保持すると規定しています。多くのこのような:オブザーバーデザインパターン - 具体的な被験者とオブザーバー

class ConcreteObserver : IObserver 
{ 
    ConcreteSubject concreteSubjectInstance; 
    //other code, etc. 
} 

さて、具体的な主題自体は件名インターフェイスを実装している(または、いくつかの抽象Subjectクラスから派生)なぜその抽象/インターフェイスであることConcreteObserverでタイプをしない場合は?私。

class ConcreteObserver : IObserver 
{ 
    ISubject concreteSubjectInstance; 
    //other code, etc. 
} 

さらに、それを(例えば)IObserverインターフェイスのフィールドにするだけではどうですか?

最終的に、パターン自体がオブザーバーとオブザーバーのカップリングを緩めるように見える場合、オブザーバーをそのサブジェクトに結合するときに昇格しないように見えるのはなぜですか?

enter image description here

またはそれはありますか?私はこれを読んだ例だけに基づいています。

+0

あなたの '参照 'を提供してください。 – Nix

+0

@Nix:完了。彼らはかなりよく知られているので、リンクせずに名前で本を参照することが十分に感じた。 –

+0

DOFactoryを投稿した例の1つでは、抽象クラスの使用を示していますか? – Nix

答えて

6

、オブザーバーは(オブザーバーパターンでいつものように)この状態に関する情報を必要とする場合、件名の状態に関する情報を受け、そうしないあなたの「更新()」メソッドは、ConcreteSubjectからGetState()メソッド(ISubjectには存在しない)を呼び出す必要があります。

このスキーマの代わりに、状態(またはConcreteSubject全体への参照)を "update()"メソッドのパラメータとして渡すことができます。代わりにISubjectのConcreteSubjectへの参照を持つ

他の一般的な説明は、あなたが(もちろんISubjectインタフェースで公開されていない)ビジネス・ロジックを呼び出すためにConcreteSubjectと対話したいことをすることができます。

+0

'更新メソッドへのパラメータとして渡す':これはオブザーバコンストラクタのパラメータとしても使用できます。 –

+0

はい、内部参照を設定するには、コンストラクタで行う必要があります。しかし、あなたが内部参照を保持していなければ、それぞれの "update()"呼び出しで引き続き受け取ることができます。これは、Java組み込みObserver Patternの実装が動作する方法です。 – edutesoy

2

あなたが読んだ定義がsubject holds a reference to the concrete observerであるという理由だけで、それを文字通り読む必要はありません。

被写体がコンクリートであろうとインターフェース/クラスを介してでもオブザーバーへの参照/リンクを持っている限り、ステートメントは真のままです。

IObserverとIObservableの両方のインターフェイスを見るのが非常に一般的です。私は、あなたが見つけようとしている問題は、あなたが主題を抽象化するときに、本当に熱心に試して、あなたの状態を一般化する方法を見つける必要があるということです。あなたの写真から

0

具体的なオブザーバーとコンクリート対象の実装にも状態があります。被験者の状態が変化すると、具体的なオブザーバーの状態も更新されます。しかし時には、あなたが持っていない主題の状態を見る必要があるかもしれません、これのために、あなたは主題への言及を持っていた方がよいでしょう。言い換えれば、具体的な主題の状態を見るためである。

関連する問題