摘要:關(guān)鍵概念理解觀察者設(shè)計模式中主要區(qū)分兩個概念觀察者指觀察者對象,也就是消息的訂閱者被觀察者指要觀察的目標對象,也就是消息的發(fā)布者。
原文首發(fā)于微信公眾號:jzman-blog,歡迎關(guān)注交流!
最近補一下設(shè)計模式相關(guān)的知識,關(guān)于觀察者設(shè)計模式主要從以下幾個方面來學習,具體如下:
什么是觀察者設(shè)計模式
關(guān)鍵概念理解
通知觀察者的方式
觀察者模式的實現(xiàn)
觀察者模式的優(yōu)缺點
使用場景
下面來一張本節(jié)內(nèi)容的思維導圖,具體如下:
什么是觀察者設(shè)計模式觀察者模式(Observer)是軟件設(shè)計模式的一種,定義了對象之間一種一對多的關(guān)系,也就是當一個對象數(shù)據(jù)發(fā)生變化時,會通知與之依賴的其他對象,以相應其數(shù)據(jù)變化,這種當目標對象數(shù)據(jù)發(fā)生變化時,與之對應的觀察者對象數(shù)據(jù)隨之發(fā)生變化的,具有一對多通知關(guān)系的設(shè)計模式叫做觀察者設(shè)計模式。
關(guān)鍵概念理解觀察者設(shè)計模式中主要區(qū)分兩個概念:
觀察者:指觀察者對象,也就是消息的訂閱者;
被觀察者:指要觀察的目標對象,也就是消息的發(fā)布者。
通知觀察者的方式當被被觀察者數(shù)據(jù)發(fā)生變化時,主要通過兩種方式通知觀察者,具體如下:
推:消息以類似廣播的形式通知觀察者,觀察者只能被動、無條件接受;
拉:接收到被觀察者的通知,可以自主決定獲取消息。
觀察者模式的實現(xiàn)下面通過兩種方式實現(xiàn)觀察者設(shè)計模式的實現(xiàn),具體如下:
手寫觀察者設(shè)計模式
Java API 提供的觀察者設(shè)計模式 使用 Java API 提供的 Observer 和 Observeable 實現(xiàn)觀察者模式
首先創(chuàng)建被觀察者,具體如下:
/** * 觀察者要觀察的目標對象 * @author jzman */ public abstract class Subject { protected ArrayListobserverList = new ArrayList<>(); //表示觀察者對目標對象(被觀察者)開始觀察 public void registerObserver(Observer obs) { observerList.add(obs); } //表示取消某觀察者對目標對象(被觀察者)的觀察 public void unRegisterObserver(Observer obs) { observerList.remove(obs); } //當目標對象(被觀察者)的狀態(tài)發(fā)生變化時,及時更新觀察者的狀態(tài) public void notifyAllObserver(){ for (Observer observer : observerList) { observer.update(this); } } }
創(chuàng)建具體的被觀察者,具體如下:
/** * 具體的目標對象(被觀察者) * @author jzman */ public class ConcreteSubject extends Subject{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; //當數(shù)據(jù)發(fā)生變化時通知其他的觀察者 notifyAllObserver(); } }
然后,為了統(tǒng)一方便,定義觀察者接口,具體如下:
/** * 觀察者統(tǒng)一接口 * @author jzman */ public interface Observer { void update(Subject subject); }
然后,創(chuàng)建具體的觀察者,具體如下:
/** * 具體的觀察者 * @author jzman */ public class ConcreteObserver implements Observer{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } @Override public void update(Subject subject) { //獲取目標對象的數(shù)據(jù)變化,同時更新當前觀察者 ConcreteSubject concreteSubject = (ConcreteSubject)subject; state = concreteSubject.getState(); } }
最后,測試觀察者設(shè)計模式,具體如下:
/** * Main * @author jzman */ public class Client { public static void main(String[] args) { //創(chuàng)建具體的目標對象(被觀察者) ConcreteSubject concreteSubject = new ConcreteSubject(); //創(chuàng)建多個具體的觀察者 ConcreteObserver obs1 = new ConcreteObserver(); ConcreteObserver obs2 = new ConcreteObserver(); ConcreteObserver obs3 = new ConcreteObserver(); //讓觀察者觀察目標對象(被觀察者)的數(shù)據(jù)變化 concreteSubject.observerList.add(obs1); concreteSubject.observerList.add(obs2); concreteSubject.observerList.add(obs3); //改變某個目標對象(被觀察者)的數(shù)據(jù) concreteSubject.setState(10); //觀察者數(shù)據(jù)是否與被觀察者數(shù)據(jù)變化一致 System.out.println("觀察者obs1:"+obs1.getState()); System.out.println("觀察者obs2:"+obs2.getState()); System.out.println("觀察者obs3:"+obs3.getState()); } }
顯然,執(zhí)行結(jié)果肯定如下:
觀察者obs1:10 觀察者obs2:10 觀察者obs3:10
通過對目標對象數(shù)據(jù)的改變,更新了與之相對應的觀察者的數(shù)據(jù),實現(xiàn)了消息的訂閱和發(fā)送。
2. Java API 提供的觀察者設(shè)計模式Java API 提供的觀察者設(shè)計模式主要通過 Observer 和 Observeable 來實現(xiàn),首先創(chuàng)建一個類繼承 Observeable 作為被觀察者,具體如下:
/** * 被觀察者(目標對象) * @author jzman */ public class ConcreteSubject extends Observable{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; //表示數(shù)據(jù)已經(jīng)發(fā)生變化 setChanged(); //具體的目標對象數(shù)據(jù)變化的時候通知觀察者 notifyObservers(state); } }
然后,創(chuàng)建一個類繼承 Observer 作為觀察者,具體如下:
/** * 觀察者 * @author jzman */ public class ConcreteObserver implements Observer{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } @Override public void update(Observable arg0, Object arg1) { ConcreteSubject concreteSubject = (ConcreteSubject) arg0; //根據(jù)目標對象(被觀察者)的數(shù)據(jù)變化更新當前觀察者的數(shù)據(jù) this.state = concreteSubject.getState(); } }
最后,測試觀察者設(shè)計模式,具體如下:
/** * 測試觀察者設(shè)計模式 * @author jzman */ public class Client { public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject(); ConcreteObserver obs1 = new ConcreteObserver(); ConcreteObserver obs2 = new ConcreteObserver(); ConcreteObserver obs3 = new ConcreteObserver(); concreteSubject.addObserver(obs1); concreteSubject.addObserver(obs2); concreteSubject.addObserver(obs3); concreteSubject.setState(100); System.out.println("觀察者obs1:"+obs1.getState()); System.out.println("觀察者obs2:"+obs2.getState()); System.out.println("觀察者obs3:"+obs3.getState()); } }
顯然,執(zhí)行結(jié)果肯定如下:
觀察者obs1:100 觀察者obs2:100 觀察者obs3:100觀察者模式的優(yōu)缺點
優(yōu)點:觀察者與被觀察者抽象耦合,可定義一種穩(wěn)定的消息觸發(fā)機制。
缺點:如果被觀察者有多個間接的觀察者,消息的傳遞將消耗更多時間,如果觀察者與被觀察者之間循環(huán)依賴,最終會導致系統(tǒng)崩潰。
使用場景觀察者設(shè)計模式在開發(fā)中使用比較廣泛,主要有以下幾個場景,具體如下:
如游戲、聊天等過程中消息的從服務端轉(zhuǎn)發(fā)給客戶端的過程
Android 中的廣播機制以及 ListView 中通知數(shù)據(jù)發(fā)生變化時也是觀察者設(shè)計模式
訂閱類相關(guān)的系統(tǒng),如當訂閱的主題有更新,訂閱者就會同步訂閱的文章。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74431.html
摘要:觀察者模式定義設(shè)計模式中對的定義一個對象稱為維持一系列依賴于它觀察者的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。如圖模式比較觀察者模式則多了一個類似于話題調(diào)度中心的流程,發(fā)布者和訂閱者解耦。 Obeserver(觀察者)模式 定義 《js設(shè)計模式》中對Observer的定義:一個對象(稱為subject)維持一系列依賴于它(觀察者)的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。 《設(shè)計模...
摘要:觀察者模式的使用場景比如你微博關(guān)注了一個人,那么這個人發(fā)布的微博就會推送到你這。 Java設(shè)計模式之觀察者模式 一直想寫一篇學習觀察者模式的總結(jié)沒有契機,今天學習阻塞隊列的原理時候看到在實現(xiàn)生產(chǎn)者消費者的時候用到了通知模式,就是所謂的觀察者模式,正好順便整理一下。 1. 簡介 觀察者模式定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更...
摘要:概念觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。觀察者模式符合接口隔離原則,實現(xiàn)了對象之間的松散耦合。 概念 觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。 當一個對象狀態(tài)發(fā)生改變后,會影響到其他幾個對象的改變,這...
摘要:最近在學的設(shè)計模式,看到了觀察者模式,在此寫下一點理解問題假如一個小販,他把產(chǎn)品的價格提升了,不同的消費者會對此產(chǎn)生不同的反應。 最近在學php 的設(shè)計模式, 看到了觀察者模式,在此寫下一點理解: 問題: 假如一個小販, 他把產(chǎn)品的價格提升了, 不同的消費者會對此產(chǎn)生不同的反應。一般的編程模式無非是獲取提升的價格,然后獲取所有的消費者,再循環(huán)每個消費者, 不同的消費者根據(jù)價格漲幅...
摘要:監(jiān)聽模式又名觀察者模式發(fā)布訂閱模式源監(jiān)聽器模式,模式的核心是設(shè)計時要區(qū)分誰是被觀察者,誰是觀察者。 監(jiān)聽模式 又名觀察者模式、發(fā)布/訂閱模式、源-監(jiān)聽器(Source/Listener)模式,模式的核心是:設(shè)計時要區(qū)分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,添加觀察者、刪除觀察者、監(jiān)聽目標變化并通知觀察者;觀察者這至少包含一個方法,當接收到被觀察者的通知時,做出相應的處理(即...
閱讀 3486·2021-11-18 10:07
閱讀 1586·2021-11-04 16:08
閱讀 1502·2021-11-02 14:43
閱讀 1083·2021-10-09 09:59
閱讀 837·2021-09-08 10:43
閱讀 1073·2021-09-07 09:59
閱讀 954·2019-12-27 11:56
閱讀 994·2019-08-30 15:56