[デザインパターン]22、オブザーバーパターン

(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收到了来自:吉米的提问:
如何学习设计模式?

画像-20210330145147116

3.オブザーバーモードに関するコメント

おすすめ

転載: blog.csdn.net/qq_40589204/article/details/119914794