13_观察者模式
【觀察者模式】
也叫作發(fā)布/訂閱模式,使用較為頻繁。
定義了對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新。
觀察者模式由以下幾個(gè)角色組成:
* Subject 被觀察者
定義被觀察者必須實(shí)現(xiàn)的職責(zé),他必須能夠動(dòng)態(tài)地增阿基、取消觀察者。一般是抽象類或?qū)崿F(xiàn)類,僅僅完成作為被觀察者必須實(shí)現(xiàn)的職責(zé):管理觀察者+通知觀察者。
* ConcreteSubject具體的被觀察者
定義觀察者自己的業(yè)務(wù)邏輯,同時(shí)定義對(duì)哪些事件進(jìn)行通知。
* Observer 觀察者
觀察者接收到消息后,即進(jìn)行update(更新方法)操作,對(duì)接收到的消息進(jìn)行處理。
* ConcreteObserver具體的觀察者
每個(gè)具體觀察者在接受到消息后的處理反應(yīng)是不一樣的,各個(gè)觀察者有自己的處理邏輯。
?
【觀察者模式 例子】
package com.Higgin.Observer; import java.util.ArrayList; import java.util.List;/*** 電視觀眾接口 */ interface Viewer{public void feel(String show); } /*** 年輕觀眾*/ class YongViewer implements Viewer{@Overridepublic void feel(String show) {System.out.println("年輕人:感覺(jué)《"+show+"》很棒!");} } /*** 老年觀眾*/ class OldViewer implements Viewer{@Overridepublic void feel(String show) {System.out.println("老年人:感覺(jué)《"+show+"》一般!");} } /*** 抽象電視節(jié)目*/ abstract class TVProgrammer{//用來(lái)保存 注冊(cè)的電視觀眾對(duì)象private List<Viewer> viewers=new ArrayList<Viewer>();//注冊(cè)一個(gè)電視觀眾public void attach(Viewer v){this.viewers.add(v);}//刪除一個(gè)電視觀眾public void detach(Viewer v){this.viewers.remove(v);}//通知所有注冊(cè)的電視觀眾public void notifyViewers(String show){for(Viewer v:viewers){v.feel(show);}} }/*** 具體的娛樂(lè)電視節(jié)目*/ class HappyTVProgrammer extends TVProgrammer{//切換不同的娛樂(lè)節(jié)目public void change(String newShow){super.notifyViewers(newShow); //調(diào)用父類的通知方法 } }public class TestObserver {public static void main(String[] args) {Viewer yong=new YongViewer(); //一個(gè)年輕觀眾Viewer old=new OldViewer(); //一個(gè)老年觀眾HappyTVProgrammer tvp=new HappyTVProgrammer(); //娛樂(lè)電視節(jié)目tvp.attach(yong); //注冊(cè)一個(gè)年輕人tvp.attach(old); //注冊(cè)一個(gè)老年人tvp.notifyViewers("極限挑戰(zhàn)");System.out.println("=============================");tvp.detach(old); //老人不愛(ài)看,解除tvp.change("奔跑吧,兄弟!");} }【運(yùn)行結(jié)果】
?
【觀察者模式 優(yōu)點(diǎn)】
* 觀察者和被觀察者之間是抽象耦合的
不管是增加觀察者還是被觀察者都非常容易,而且在java中已經(jīng)實(shí)現(xiàn)了抽象層級(jí)的定義,在系統(tǒng)擴(kuò)展方面應(yīng)用良好。
* 建立了一套觸發(fā)機(jī)制
根據(jù)單一職責(zé)原則,每個(gè)類的職責(zé)是單一的,如A事件觸發(fā)B事件,B事件觸發(fā)C事件...這是一個(gè)觸發(fā)機(jī)制,形成一個(gè)觸發(fā)鏈,觀察者模式可以實(shí)現(xiàn)這里的鏈條形式。
【觀察者模式 缺點(diǎn)】
要考慮開(kāi)發(fā)效率和運(yùn)行效率的問(wèn)題,一個(gè)被觀察者,多個(gè)觀察者,開(kāi)發(fā)和調(diào)試較為復(fù)雜,而且在JAVA中消息通知默認(rèn)是順序執(zhí)行的,一個(gè)觀察者卡殼,會(huì)影響整體的執(zhí)行效率。這種情況一般會(huì)采用異步的方式。
【觀察者模式 使用場(chǎng)景】
* 關(guān)聯(lián)行為場(chǎng)景,注意關(guān)聯(lián)行為是可拆分的,而不是“組合”關(guān)系。
* 事件多級(jí)觸發(fā)場(chǎng)景。
* 跨系統(tǒng)的消息交換場(chǎng)景。
?
轉(zhuǎn)載于:https://www.cnblogs.com/HigginCui/p/6225729.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: mysql 日期
- 下一篇: 170525、解决maven隐式依赖包版