觀察者模式
在對(duì)象之間定義了一對(duì)多的依賴离赫,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)锣光,依賴它的對(duì)象會(huì)收到通知并自動(dòng)更新笆怠。
打個(gè)比方,微信公眾號(hào)推出了一篇文章誊爹,關(guān)注此公眾號(hào)的用戶都會(huì)收到推送蹬刷,下面看具體實(shí)現(xiàn)
在實(shí)現(xiàn)之前呢,首先要清楚觀察者模式有幾個(gè)角色:
- 主題抽象:被觀察者的頂層抽象频丘、標(biāo)準(zhǔn)办成,可以是接口或者抽象類,將所有的觀察者對(duì)象保存在集合屬性中搂漠,可以對(duì)觀察者進(jìn)行新增和刪除迂卢,同時(shí)可以通知所有觀察者,見下圖
MySubject
- 主題實(shí)現(xiàn)類:對(duì)主題抽象的具體實(shí)現(xiàn)
- 觀察者抽象:觀察者的頂層抽象桐汤,可以是接口或者抽象類而克,提供狀態(tài)更新方法,與主題類進(jìn)行同步
- 觀察者實(shí)現(xiàn)類:對(duì)觀察者抽象的具體實(shí)現(xiàn)
- UML類圖
-
主題抽象
MySubject
public interface MySubject { //添加觀察者 void addObserver(MyObserver userObserver); //刪除觀察者 void removeObserver(MyObserver userObserver); //去通知觀察者 void notifyUser(); }
-
微信公眾號(hào)
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("微信公眾號(hào)發(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); } }
-
測(cè)試類
public class ObserverTest { public static void main(String[] args) { //初始化微信公眾號(hào) WechatSubject subject = new WechatSubject(); //創(chuàng)建觀察者實(shí)現(xiàn)類 MyObserver user1 = new User1(); MyObserver user2 = new User2(); //將觀察者注冊(cè)到公眾號(hào)中 subject.addObserver(user1); subject.addObserver(user2); //公眾號(hào)更新文章 subject.updateArtical("阿里年薪兩百萬(wàn)P8大佬網(wǎng)上征婚引起熱議~~~~~"); subject.removeObserver(user1); System.out.println("======================"); subject.updateArtical("滴滴某技術(shù)部門裁員30%~~~~~"); } }
-
輸出
微信公眾號(hào)發(fā)布了消息:阿里年薪兩百萬(wàn)P8大佬網(wǎng)上征婚引起熱議~~~~~ ============================== User1接受到了此消息:阿里年薪兩百萬(wàn)P8大佬網(wǎng)上征婚引起熱議~~~~~ User2接受到了此消息:阿里年薪兩百萬(wàn)P8大佬網(wǎng)上征婚引起熱議~~~~~ ====================== 微信公眾號(hào)發(fā)布了消息:滴滴某技術(shù)部門裁員30%~~~~~ ============================== User2接受到了此消息:滴滴某技術(shù)部門裁員30%~~~~~