您好,登錄后才能下訂單哦!
這篇文章主要用代碼詳解Java設計模式之觀察者模式原理與用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
本文實例講述了Java設計模式之觀察者模式原理與用法。分享給大家供大家參考,具體如下:
可以這么理解:
觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。
這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。
也可以這樣理解:
觀察者模式是關于多個對象想知道一個對象中數據變化情況的一種成熟模式。觀察者模式中有一個稱作“主題”的對象和若干個稱作“觀察者”的對象,“主題”和“觀察者”之間是一種一對多的依賴關系。
當“主題”的狀態發生變化時,所有“觀察者”都得到通知。
日常生活中,最容易理解的例子就是微信公眾號。我們用微信訂閱的微信公共號就是這里所說的主題,而我們 每一個關注這個微信號的人就是這里的觀察者。公眾號每天有更新,所有訂閱者都會收到。
觀察者模式類圖:
一般被用來實現事件處理系統。
從定義看,可以分成兩個角色, 觀察者和被觀察對象(即主題)
從類圖看,代碼實現有四個角色:
抽象主題角色: 把所有對觀察者對象的引用保存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者角色。一般用一個抽象類和接口來實現。
抽象觀察者角色:為所有具體的觀察者定義一個接口,在得到主題的通知時更新自己。
具體主題角色:在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類實現。
具體觀察者角色:該角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。通常用一個子類實現。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。
主題接口規定了具體主題需要實現的添加,刪除及通知觀察者更新數據的方法
/** * 抽象主題,被觀察者 * */ public interface Subject { /** * 添加觀察者 * * @param observer */ void addObserver(Observer observer); /** * 移除指定的觀察者 * * @param observer */ void removeObserver(Observer observer); /** * 移除所有的觀察者 */ void removeAll(); /** * data 是要通知給觀察者的數據 因為Object是所有類的父類,可以使用多態,當然 你也可以使用 泛型 * * @param data */ void notifyAllObserver(Object data); /** * 單獨 通知某一個觀察者 * * @param observer * @param data * data 是要通知給觀察者的數據 因為Object是所有類的父類,可以使用多態,當然 你也可以使用 泛型 */ void notify(Observer observer, Object data); }
觀察者接口規定了具體觀察者用來更新數據的方法
/** * 抽象觀察者接口 */ public interface Observer { /** * * @param subject 被觀察者 * @param data 被觀察者傳遞給觀察者的 數據 */ void update(Subject subject,Object data); }
public class ConcreteSubject implements Subject { //觀察者集合,用于管理所有的觀察者 List<Observer> mList = new ArrayList<>(); @Override public void addObserver(Observer observer) { // TODO Auto-generated method stub // 確保相同的觀察者只含有一個 if (observer == null) { throw new NullPointerException("observer == null"); } if (!mList.contains(observer)) { mList.add(observer); } } @Override public void removeObserver(Observer observer) { // TODO Auto-generated method stub mList.remove(observer); } @Override public void removeAll() { // TODO Auto-generated method stub mList.clear(); } @Override public void notifyAllObserver(Object data) { // TODO Auto-generated method stub for (Observer observer : mList) { observer.update(this, data); } } @Override public void notify(Observer observer, Object data) { // TODO Auto-generated method stub if (observer != null) { observer.update(this, data); } } }
這里我們可以定義多個具體的觀察者角色
觀察者One
public class ObserverOne implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString()); } }
觀察者Two
public class ObserverTwo implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString()); } }
觀察者Three
public class ObserverThree implements Observer { @Override public void update(Subject subject, Object data) { // TODO Auto-generated method stub System.err .println("the messge from subject to-->" + this.getClass().getName() + "<---is " + data.toString()); } }
public class TestObservePattern { public static void main(String[] args) { // TODO Auto-generated method stub ConcreteSubject concreteSubject = new ConcreteSubject(); ObserverOne observerOne=new ObserverOne(); ObserverTwo observerTwo=new ObserverTwo(); ObserverThree observerThree=new ObserverThree(); concreteSubject.addObserver(observerOne); concreteSubject.addObserver(observerTwo); concreteSubject.addObserver(observerThree); //通知所有的觀察者 concreteSubject.notifyAllObserver("wake up,wake up"); //通知某個特定的觀察者OberverTwo concreteSubject.notify(observerTwo, "Specila msg for you"); //觀察者ObserveThree 決定不再訂閱主題 concreteSubject.removeObserver(observerThree); //通知所有的觀察者 concreteSubject.notifyAllObserver("new Message come "); } }
看完上述內容,是不是對用代碼詳解Java設計模式之觀察者模式原理與用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。