- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java設計模式之觀(guān)察者模式(Observer模式)
當對象間存在一對多關(guān)系時(shí),則使用觀(guān)察者模式(Observer Pattern)。當一個(gè)對象被修改時(shí),則會(huì )自動(dòng)通知依賴(lài)它的對象。觀(guān)察者模式屬于行為型模式。
人話(huà): 就像微信公眾號推送消息,訂閱的人能收到,沒(méi)訂閱的收不到,還可以取消/添加訂閱
1.抽象主題
public interface Subject { /** * 注冊觀(guān)察者 */ void registerObserver(observer observer); /** * 移除觀(guān)察者 */ void removeObserver(observer observer); /** * 通知觀(guān)察者 */ void notifyObservers(); }
2.抽象觀(guān)察者角色
public interface observer { /** * 更新 */ void update(String message); }
3.具體主題
用Vector是線(xiàn)程同步的,比較安全,也可以使用ArrayList,是線(xiàn)程異步的,但不安全。
public class WechatServer implements Subject{ //注意到這個(gè)List集合的泛型參數為Observer接口,設計原則:面向接口編程而不是面向實(shí)現編程 private Vector<observer> list; private String message; public WechatServer() { list = new Vector<observer>(); } @Override public void registerObserver(observer observer) { list.add(observer); } @Override public void removeObserver(observer observer) { if(!list.isEmpty()) list.remove(observer); } @Override public void notifyObservers() { for(int i = 0; i < list.size(); i++) { observer oserver = list.get(i); oserver.update(message); } } public void setInfomation(String s) { this.message = s; System.out.println("微信服務(wù)更新消息: " + s); //消息更新,通知所有觀(guān)察者 notifyObservers(); } }
4.具體觀(guān)察者角色
public class User implements observer { private String name; private String message; public User(String name) { this.name = name; } @Override public void update(String message) { this.message = message; read(); } public void read() { System.out.println(name + " 收到推送消息: " + message); } }
5.測試類(lèi)
public class Test { public static void main(String[] args) { //主題 WechatServer server = new WechatServer(); //觀(guān)察者 observer userZhang = new User("ZhangSan"); observer userLi = new User("LiSi"); observer userWang = new User("WangWu"); server.registerObserver(userZhang); server.setInfomation("C是世界上最好用的語(yǔ)言!"); System.out.println("===================================="); server.registerObserver(userLi); server.registerObserver(userWang); server.setInfomation("JAVA是世界上最好用的語(yǔ)言!"); } }
6.結果
優(yōu)點(diǎn)
解除耦合,讓耦合的雙方都依賴(lài)于抽象,從而使得各自的變換都不會(huì )影響另一邊的變換。
缺點(diǎn)
在應用觀(guān)察者模式時(shí)需要考慮一下開(kāi)發(fā)效率和運行效率的問(wèn)題,程序中包括一個(gè)被觀(guān)察者、多個(gè)觀(guān)察者,開(kāi)發(fā)、調試等內容會(huì )比較復雜,而且在Java中消息的通知一般是順序執行,那么一個(gè)觀(guān)察者卡頓,會(huì )影響整體的執行效率,在這種情況下,一般會(huì )采用異步實(shí)現。
當一個(gè)對象的改變需要同時(shí)改變其它對象,并且它不知道具體有多少對象有待改變的時(shí)候,應該考慮使用觀(guān)察者模式。 而使用觀(guān)察者模式的動(dòng)機在于:將一個(gè)系統分割成一系列相互協(xié)作的類(lèi)有一個(gè)很不好的副作用,就是需要維護相關(guān)對象間的一致性,我們不希望為了維持一致性而使各類(lèi)緊密耦合,這樣會(huì )給維護、擴展和重用都帶來(lái)不便,而觀(guān)察者模式所做的工作就是在解除耦合。
到此這篇關(guān)于Java設計模式之觀(guān)察者模式(Observer模式)的文章就介紹到這了,更多相關(guān)Java觀(guān)察者模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2