JAVA観察者パターン例剖析


オブザーバモードは、オブジェクト間の1対多の依存関係を定義することを意図した動作モードに属し、1つのオブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新される.システムを作成する過程で、1つのシステムを一連の相互協力クラスに分割するには、関連オブジェクト間の一貫性を維持する必要がある一般的な副作用があります.一貫性を維持するために、さまざまな緊密な結合を望んでいません.これは、彼らの充填性を低下させるためです.このモードのキーオブジェクトはターゲット(Subject)とオブザーバーです(Observer).ターゲットに依存する任意の数のオブジェクトを持つことができ、ターゲットのステータスが変更されると、すべてのオブジェクトが通知されます.この通知に対する応答として、各オブジェクトはターゲットのステータスをターゲットのステータスと同期させるためにターゲットをクエリーします.このインタラクションは、通知のパブリッシャをターゲットとするパブリッシング・サブスクリプション・モードとも呼ばれます.彼が通知を発行したとき誰が彼の観察者なのかを知る必要はなく、任意のデータを持つ観察者が購読し、通知を受信することができる.
適用性:lは、1つの抽象モデルに2つの態様があり、そのうちの1つの態様が別の態様に依存する場合、観察者モードを使用することができる.これら2つを独立したオブジェクトにカプセル化することで、それぞれ独立して変更および多重化することができる.l一つのオブジェクトの変更に対して他のオブジェクトを同時に変更する必要がある場合、具体的にどのくらいのオブジェクトが変更されるべきか分からない.lオブジェクトが他のオブジェクトに通知しなければならない場合、他のオブジェクトが誰であるかを仮定することはできません.言い換えれば、これらのオブジェクトが緊密に結合されていることを望んでいません.例えば、先生はまた電話番号を持っていて、学生は先生の電話番号を知っていて、時間に合った時に電話をかけることができます.このような組み合わせの中で、先生は被験者(Subject)であり、学生は情報を知る必要がある観察者であり、先生の電話番号が変更された場合、学生は通知を受け、対応する電話記録を更新する.全体の構造は図1に示す通りである.
図1学生観察先生のモデル参加者:Subject(ターゲット,Subject):ターゲットがその観察者を知っている.任意の複数の観察者が同じ目標を観察することができる.オブジェクトを登録および削除するインタフェースを提供します.Observer(オブザーバー、Observer):ターゲットが変更されたときに通知を取得する必要があるオブジェクトの更新インタフェースを定義します.ConcreteSubject(特定のターゲット、Teacher)は、関連する状態を各ConcreteObserveオブジェクトに格納します.彼の状態が変わったとき、彼の各観察者に通知を出した.ConcreteObserver(オブザーバー、Studio):ConcreteSubjectオブジェクトへの参照を維持します.ターゲットのステータスと一致するステータスを格納します.Observerの更新インタフェースを実装し、自身の状態とターゲットの状態を一致させる.
コラボレーション関係:ConcreteSubjectが観察者自身の状態と一致しない可能性のある変化が発生した場合、彼は各観察者に通知します.特定のターゲットの変更通知を取得すると、ConcreteObserverオブジェクトはターゲットオブジェクトに情報を問い合わせることができます.ConcreteObserverは、これらの情報を使用して、彼の状態がターゲットオブジェクトの状態と一致するようにします.
関連コード:Subjectコード:
   
package observer;public interface Subject{    
public void attach(Observer o);    
public void detach(Observer o);    
public void notice();
}

Observerコード:

package observer;
public interface Observer{    
public void update();
}

Teacherコード;

package observer;
import java.util.Vector;
public class Teacher implements Subject{    
private String phone;    
private Vector students;    
public Teacher(){       
phone = "";       
students = new Vector();    
}    
public  void attach(Observer o){       
students.add(o);    
}    
public void detach(Observer o){       
students.remove(o);    
}    
public void notice(){       
for(int i=0;i<students.size();i++)           
((Observer)students.get(i)).update();    
}    
public void setPhone(String phone){       
this.phone = phone;       
notice();    
}    
public String getPhone(){       
return phone;    
}
}

Studioコード:

package observer;
public class Student implements Observer{    
private String name;    
private String phone;    
private Teacher teacher;    
public Student(String name,Teacher t){       
this.name = name;       
teacher = t;    
}    
public void show(){       
System.out.println("Name:"+name+"
Teacher'sphone:"+phone); } public void update(){ phone = teacher.getPhone(); }}

Clientコード:

package observer;
import java.util.Vector;
public class Client{    
public static void main(String[] args){       
Vector students = new Vector();       
Teacher t = new Teacher();       
for(int i= 0 ;i<10;i++){           
Student st = new Student("lili"+i,t);           
students.add(st);           
t.attach(st);       
}       
t.setPhone("88803807");       
for(int i=0;i<10;i++)              
((Student)students.get(i)).show();       
t.setPhone("88808880");       
for(int i=0;i<10;i++)              
((Student)students.get(i)).show();    
}
}    
 
まとめ:Observerモードの最も有名な応用はMVC構造であり、Observerモードはドキュメントとグラフプログラムの作成によく応用できる.