觀察者模式

1.定義

觀察者模式(Observer Pattern) 定義了對象之間一對多依賴
讓多個觀察者對象同時監(jiān)聽一個主體對象,當(dāng)主體對象發(fā)生變化時,它的所有依賴者(監(jiān)聽者)都會收到通知并更新
屬于行為型模式
也叫作發(fā)布訂閱模式

2.JDK實現(xiàn)

/**
 * Description:論壇(被觀察者)
 *
 * @date 2019-05-28 20:25
 */

public class Forum extends Observable {

    private String name = "XX論壇";
    private static Forum instance;

    private Forum() {
    }

    public static Forum getInstance() {
        if (instance == null) {
            instance = new Forum();
        }
        return instance;
    }

    public String getName() {
        return name;
    }


    public void publish(Question question) {
        System.out.println(question.getUserName() + "發(fā)布一個問題,具體內(nèi)容為:" + question.getContent());
        setChanged();
        notifyObservers(question);
    }
}

/**
 * Description:問題
 *
 * @date 2019-05-28 20:36
 */

public class Question {

    private String userName;
    private String content;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

/**
 * Description:版主(觀察者)
 *
 * @date 2019-05-28 20:38
 */

public class Moderator  implements Observer {

    private String name;

    public Moderator(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Forum forum = (Forum)o;
        Question question = (Question)arg;
        System.out.println("======================================");
        System.out.println(name+"版主,你好"+"\n"
        +question.getUserName()+"在 <"+forum.getName()+"> 發(fā)布了一個問題,\n"
        +"內(nèi)容:"+question.getContent());
    }
}

/**
 * Description:測試類
 *
 * @date 2019-05-28 20:44
 */

public class Test {

    public static void main(String[] args) {

        Forum forum = Forum.getInstance();
        Moderator a = new  Moderator("A版主");
        Moderator b = new  Moderator("B版主");

        Question question = new Question();
        question.setUserName("小白");
        question.setContent("花兒為什么這樣紅?");

        forum.addObserver(a);
        forum.addObserver(b);

        forum.publish(question);
    }
}

3.guava實現(xiàn)

public class GuavaEvent {

    @Subscribe
    public void  subscribe(String src){
        System.out.println("執(zhí)行GuavaEvent 類的subscribe("+src+")方法");
    }
}

public class Test {

    public static void main(String[] args) {
        //消息總線
        EventBus eventBus = new EventBus();
        
        GuavaEvent guavaEvent = new GuavaEvent();

        eventBus.register(guavaEvent);
        eventBus.post("sKy");
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容