(22)オブザーバーモード
オブザーバーパターン(オブザーバーパターン)は、パブリッシュ/サブスクライブパターンとも呼ばれます。1対多の依存関係を定義することにより、オブザーバーの変更をオブザーバーに時間内に通知できます。メッセージの公開と同様のメカニズムにより、2つの分離が実現されます。
1.オブザーバーパターンの設計原則
1.抽象サブジェクト(ISubject):オブザーバーオブジェクトに通知する抽象メソッドを定義します。
2. ConcreateSubject:特定のサブジェクト。
3.抽象オブザーバー(IObserver):通知に応じて更新メソッドを定義します。
4、Concrete Observer(ConcreateObserver):応答します。
2.簡単な例
V2EXコミュニティのシンプルなサブスクリプション機能は、JavaAPIを介して実現されます。
public class V2EX extends Observable {
private String name = "V2EX";
private static V2EX v2EX = null;
private V2EX(){
};
public static V2EX getInstance(){
if(null == v2EX){
v2EX = new V2EX();
}
return v2EX;
}
public String getName() {
return name;
}
/**
* 发布消息方法
* @param question 被通知的消息
*/
public void publishQuestion(Question question){
System.out.println(question.getUserName()+"在"+this.name+"上,发出了一个问题。");
// 状态改变
setChanged();
// 通知所有观察者
notifyObservers(question);
}
}
public class Teacher implements Observer {
private String name;
public Teacher(String name){
this.name = name;
}
/**
* 观察者更新的方法
* @param observable observable对象
* @param object 被观察者回传的消息对象
*/
@Override
public void update(Observable observable, Object object){
V2EX v2EX = (V2EX) observable;
Question question = (Question) object;
System.out.println("----------------");
System.out.println(name+"收到了来自:"+question.getUserName()+"的提问:\n"+question.getContent());
}
}
public class Question {
private String userName;
private String content;
//get,set
}
public class Client {
public static void main(String[] args) {
V2EX v2EX = V2EX.getInstance();
Teacher toy = new Teacher("Toy");
Teacher lucy = new Teacher("Lucy");
// 订阅主题
v2EX.addObserver(toy);
v2EX.addObserver(lucy);
// 被观察者消息
Question question = new Question();
question.setUserName("吉米");
question.setContent("如何学习设计模式?");
// 被观察者一旦发布消息,观察者就会接收到消息。
v2EX.publishQuestion(question);
}
}
吉米在V2EX上,发出了一个问题。
----------------
Lucy收到了来自:吉米的提问:
如何学习设计模式?
----------------
Toy收到了来自:吉米的提问:
如何学习设计模式?