您好,登錄后才能下訂單哦!
這篇“Java觀察者模式實例代碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java觀察者模式實例代碼分析”文章吧。
1.觀察者和被觀察者是抽象耦合的。
2.建立一套觸發(fā)機制。
1.如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
2.如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。
3.觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。
一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復(fù)用。
一個對象的改變將導(dǎo)致其他一個或多個對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度。
一個對象必須通知其他對象,而并不知道這些對象是誰。
需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈式觸發(fā)機制。
1.JAVA 中已經(jīng)有了對觀察者模式的支持類。
2.避免循環(huán)引用。
3.如果順序執(zhí)行,某一觀察者錯誤會導(dǎo)致系統(tǒng)卡殼,一般采用異步方式。
package com.asurplus.common.observe; /** * 觀察者 */ public abstract class Observer { protected Subject subject; /** * 發(fā)布事件 */ public abstract void update(); }
package com.asurplus.common.observe; import lombok.extern.slf4j.Slf4j; @Slf4j public class Observer1 extends Observer { public Observer1(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("觀察者 1 收到通知:{}", this.subject.getState()); } }
package com.asurplus.common.observe; import lombok.extern.slf4j.Slf4j; @Slf4j public class Observer2 extends Observer { public Observer2(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("觀察者 2 收到通知:{}", this.subject.getState()); } }
package com.asurplus.common.observe; import lombok.extern.slf4j.Slf4j; @Slf4j public class Observer3 extends Observer { public Observer3(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("觀察者 3 收到通知:{}", this.subject.getState()); } }
package com.asurplus.common.observe; import java.util.ArrayList; import java.util.List; /** * 主題 */ public class Subject { /** * 觀察者列表 */ private List<Observer> observers = new ArrayList<>(); /** * 標志 */ private int state; public int getState() { return state; } /** * 標識被改變 * * @param state */ public void setState(int state) { this.state = state; // 通知所有觀察者 notifyAllObservers(); } /** * 添加進接收者列表 * * @param observer */ public void attach(Observer observer) { observers.add(observer); } /** * 通知所有人被改變 */ public void notifyAllObservers() { for (Observer observer : observers) { observer.update(); } } }
類似于消息發(fā)布一樣,有多個接收者,當標志位被改變的時候,通知多個接收者。
package com.asurplus.common.observe; public class TestMain { public static void main(String[] args) { // 創(chuàng)建主題 Subject subject = new Subject(); // 添加觀察者 new Observer1(subject); new Observer2(subject); new Observer3(subject); // 改變標志 subject.setState(10); } }
輸出結(jié)果
可以看出,三個接收者都收到了事件通知,從而實現(xiàn)了我們的觀察者模式。
以上就是關(guān)于“Java觀察者模式實例代碼分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。