定義:各オブジェクトは、それに依存するすべてのオブジェクトが自動的に通知され、更新されるときには、状態が変化するので、被写体との間で、多くの依存関係を定義します。
種類:クラスの行動パターン(も知られているリリース- (パブリッシュ/サブスクライブ購読)モード)
クラス図:
多くの場合、ソフトウェアシステムの需要があります:オブジェクトの状態が変更された場合、それに関連付けられたオブジェクトのいくつかは、適切な変更を加える必要があります。例えば、我々はメニューをポップアップ表示されます、機能的な右クリックメニューをデザインするだけでソフトウェアの活発な地域で、マウスの右ボタンをクリックします。別の例では、我々はときEclipse開発と同様に、自動展開機能を設計したい限り、変更されたファイルを、Eclipseが自動的にサーバに変更したファイルを展開します。これらの2つの機能があれば、変更が発生している状態だと、自分自身の適切なアクションを行う必要があります、別のオブジェクトへのオブジェクトのために待機している同様の場所を、持っています。実際には、Observerパターンを使用した疑いが主流の選択で、このプログラムに多くを達成することが可能ですが、。
構造オブザーバーパターン
次の4つの役割を含む、最も基本的なモードオブザーバでは:
- 観察者である:としては、図クラスで見ることができ、クラスは、リストを使用せずに使用することビューアオブジェクトのベクトル(ベクトル理由貯蔵容器を有し、マルチスレッド動作するので、ベクターは安全であり、リスト安全ではないが)、これは観察ベクトルコンテナクラスのコアであり、三つの追加の方法がある:観察者に物体を取り付けるには、コンテナを追加することである。デタッチオブジェクトがコンテナから視聴者を除去することである、方法を通知これは、順番に対応する方法オブザーバオブジェクトを呼び出すことです。多くの場合、より多くの抽象クラスを使用するので、他のモードと混合しないので、この役割は、インタフェースすることができ、それは、抽象や具象クラスすることができます。
- オブザーバー:オブザーバーの役割は、一般的に、それが唯一の更新方法、オブザーバーの状態の変化インターフェースである場合、このメソッドは呼び出しをトリガされます。
- 具体的に観察された:拡張を容易にするための役割を使用して、特定のビジネスロジックは、この役割で定義されてもよいです。
- 特定の視聴者:インターフェースの視聴者の特定の実装は、この役割では、ロジックは、観察者がオブジェクトの状態を変更したときに処理されるように定義されます。
オブザーバーモードコードの実装
abstract class Subject {
private Vector<Observer> obs = new Vector<Observer>();
public void addObserver(Observer obs){
this.obs.add(obs);
}
public void delObserver(Observer obs){
this.obs.remove(obs);
}
protected void notifyObserver(){
for(Observer o: obs){
o.update();
}
}
public abstract void doSomething();
}
class ConcreteSubject extends Subject {
public void doSomething(){
System.out.println("被观察者事件发生");
this.notifyObserver();
}
}
interface Observer {
public void update();
}
class ConcreteObserver1 implements Observer {
public void update() {
System.out.println("观察者1收到信息,并进行处理。");
}
}
class ConcreteObserver2 implements Observer {
public void update() {
System.out.println("观察者2收到信息,并进行处理。");
}
}
public class Client {
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.addObserver(new ConcreteObserver1()); //添加观察者1
sub.addObserver(new ConcreteObserver2()); //添加观察者2
sub.doSomething();
}
}
結果:
観察されたイベント
1人の視聴者情報を受信して処理します。
2観察者情報、およびプロセスを受けます。
その結果、我々はちょうど件名のアプローチを呼び出して、実行することで見ることができますが、同時に2つの関連した方法のオブザーバーを同時に呼ばれています。コードをよく見は、実際には非常に簡単です、Subjectクラス協会Observerクラスで見た目以上のものではなく、ライン上のdoSomethingのメソッドオブザーバー更新方法でそれを横断。
Observerパターンの利点
観測者と軽度の属する観測された関係、およびアブストラクト間の両方のために、それを拡張することは比較的容易であるので、こと、結合されています。
オブザーバーパターンは、方法は、順次各オブザーバーを処理し、鎖形態をトリガ共通のトリガ機構です。パフォーマンスの問題がより心配であるとき、チェーンがときより多くの視聴者がトリガされたので、しかし同時に、それは、欠点オブザーバモードになります。そして、鎖状構造で、循環参照のエラーは、システム仮死を引き起こすことになりやすいです。
概要
Java言語は、インタフェースオブザーバーだけでなく、その実装クラス観察可能は、観察者の役割は、多くの場合、達成されました。我々は、これら2つの特定のクラスは、APIドキュメントのJDKで使用するために見ることができます。
VC ++、そのイベント処理のすべてのjavascriptのDOMや友人AWTの開発は、オブザーバーモードを理解するために、一定の理解の原則上のイベント処理メカニズムを魔法を感じました。あなたは良い選択をObserverパターンを使用している、トリガイベント処理メカニズムを設計したい場合は、AWTイベントハンドリングDEM(デリゲートイベントモデル委譲イベントモデル)は、オブザーバーパターンの実装を使用することです。