觀察者模式
在對象之間定義了一對多的依賴,這樣一來,當(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
-
主題抽象
MySubjectpublic 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(); } } -
觀察者抽象
MyObserverpublic interface MyObserver { void update(String message); } -
觀察者實(shí)現(xiàn)類
User1public class User1 implements MyObserver{ @Override public void update(String message) { System.out.println("User1接受到了此消息:"+message); } } -
觀察者實(shí)現(xiàn)類
User2public 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%~~~~~