觀察者模式

觀察者模式

在對象之間定義了一對多的依賴,這樣一來,當(dāng)一個(gè)對象改變狀態(tài),依賴它的對象會收到通知并自動更新。

打個(gè)比方,微信公眾號推出了一篇文章,關(guān)注此公眾號的用戶都會收到推送,下面看具體實(shí)現(xiàn)


在實(shí)現(xiàn)之前呢,首先要清楚觀察者模式有幾個(gè)角色:

  • 主題抽象:被觀察者的頂層抽象、標(biāo)準(zhǔn),可以是接口或者抽象類,將所有的觀察者對象保存在集合屬性中,可以對觀察者進(jìn)行新增和刪除,同時(shí)可以通知所有觀察者,見下圖MySubject
  • 主題實(shí)現(xiàn)類:對主題抽象的具體實(shí)現(xiàn)
  • 觀察者抽象:觀察者的頂層抽象,可以是接口或者抽象類,提供狀態(tài)更新方法,與主題類進(jìn)行同步
  • 觀察者實(shí)現(xiàn)類:對觀察者抽象的具體實(shí)現(xiàn)
  • UML類圖
觀察者模式.png
  • 主題抽象 MySubject

    public interface MySubject {
      //添加觀察者
        void addObserver(MyObserver userObserver);
      //刪除觀察者
        void removeObserver(MyObserver userObserver);
      //去通知觀察者
        void notifyUser();
    
    }
    
  • 微信公眾號WechatSubject(主題實(shí)現(xiàn)類)

    public class WechatSubject implements MySubject {
    
        private List<MyObserver> list = new ArrayList<MyObserver>();
        private String message;
        @Override
        public void addObserver(MyObserver userObserver) {
            list.add(userObserver);
        }
    
        @Override
        public void removeObserver(MyObserver userObserver) {
            list.remove(userObserver);
        }
    
        @Override
        public void notifyUser() {
    
            for(MyObserver observer : list){
    
                observer.update(message);
    
            }
        }
    
        public  void updateArtical(String message){
            this.message = message;
    
            System.out.println("微信公眾號發(fā)布了消息:"+message);
            System.out.println("==============================");
            this.notifyUser();
        }
    }
    
  • 觀察者抽象 MyObserver

    public interface MyObserver {
    
        void update(String message);
    }
    
  • 觀察者實(shí)現(xiàn)類 User1

    public class User1 implements MyObserver{
        @Override
        public void update(String message) {
            System.out.println("User1接受到了此消息:"+message);
        }
    }
    
  • 觀察者實(shí)現(xiàn)類 User2

    public class User2 implements MyObserver{
        @Override
        public void update(String message) {
            System.out.println("User2接受到了此消息:"+message);
        }
    }
    
  • 測試類

    public class ObserverTest {
    
    
        public static void main(String[] args) {
            //初始化微信公眾號
            WechatSubject subject = new WechatSubject();
    
            //創(chuàng)建觀察者實(shí)現(xiàn)類
            MyObserver user1 = new User1();
            MyObserver user2 = new User2();
    
            //將觀察者注冊到公眾號中
            subject.addObserver(user1);
            subject.addObserver(user2);
    
            //公眾號更新文章
            subject.updateArtical("阿里年薪兩百萬P8大佬網(wǎng)上征婚引起熱議~~~~~");
            subject.removeObserver(user1);
            System.out.println("======================");
            subject.updateArtical("滴滴某技術(shù)部門裁員30%~~~~~");
        }
    }
    
  • 輸出

    微信公眾號發(fā)布了消息:阿里年薪兩百萬P8大佬網(wǎng)上征婚引起熱議~~~~~
    ==============================
    User1接受到了此消息:阿里年薪兩百萬P8大佬網(wǎng)上征婚引起熱議~~~~~
    User2接受到了此消息:阿里年薪兩百萬P8大佬網(wǎng)上征婚引起熱議~~~~~
    ======================
    微信公眾號發(fā)布了消息:滴滴某技術(shù)部門裁員30%~~~~~
    ==============================
    User2接受到了此消息:滴滴某技術(shù)部門裁員30%~~~~~
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 何時(shí)使用觀察者模式 1、觸發(fā)聯(lián)動:當(dāng)修改目標(biāo)狀態(tài)時(shí)就會觸發(fā)相應(yīng)的通知,然后會循環(huán)調(diào)用所有注冊的觀察者對象的相應(yīng)方法...
    哥哥是歐巴Vitory閱讀 398評論 0 0
  • 前言定義:觀察者設(shè)計(jì)模式定義了對象間的一種一對多的依賴關(guān)系,以便一個(gè)對象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對象都得到...
    xsp單細(xì)胞閱讀 497評論 0 1
  • 深夜總是讓人深思,在這寂靜的空間里,白日的煩惱似乎都已消失,只剩下我和我心中的一隅。這個(gè)城市睡去了,好像只有我一個(gè)...
    Yuki_Liu閱讀 270評論 0 0
  • Our deepest fear is not that we are inadequate. Our deepe...
    雨天的那棵樹閱讀 401評論 0 1
  • 文:閆曉雨 前段時(shí)間有篇文章很受讀者歡迎。 于是有人跑來問我說,你怎么可以活得這么肆意?我想,有很多人潛意識里可能...
    閆曉雨閱讀 447評論 0 5

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