觀察者模式
1.定義:
定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),則所有依賴它的對(duì)象都會(huì)得到通知,并自動(dòng)更新。
2.使用場(chǎng)景:
- 關(guān)聯(lián)行為場(chǎng)景,注意,關(guān)聯(lián)行為是可拆分的,而不是‘組合’關(guān)系;
- 事件多級(jí)觸發(fā)場(chǎng)景;
- 跨系統(tǒng)的消息交換場(chǎng)景,如消息隊(duì)列、事件總線的處理機(jī)制。
3.UML圖
4.詳解:
觀察者模式又稱為發(fā)布-訂閱模式,是一種使用頻率非常高的設(shè)計(jì)模式,它常用的地方是GUI系統(tǒng),訂閱-發(fā)布系統(tǒng),是一種行為型設(shè)計(jì)模式。觀察者模式的主要作用是使得對(duì)象解耦,將觀察者與被觀察者完全隔離,僅依賴于Observer接口與Observable類。
- 優(yōu)點(diǎn):觀察者與被觀察者之間是抽象耦合,應(yīng)對(duì)業(yè)務(wù)變化;增強(qiáng)系統(tǒng)靈活性、可擴(kuò)展性。
- 缺點(diǎn):在應(yīng)用觀察者模式時(shí)需要考慮開(kāi)發(fā)效率和運(yùn)行效率的問(wèn)題,程序中包括一個(gè)被觀察者、多個(gè)觀察者、開(kāi)發(fā)和調(diào)試等內(nèi)容會(huì)比較復(fù)雜,而且在java中消息的通知默認(rèn)是順序執(zhí)行,一旦某個(gè)觀察者卡頓,會(huì)影響整體的執(zhí)行效率,在這種情況下,一般考慮采用異步的方式。
下面就以程序猿訂閱某網(wǎng)站的內(nèi)容舉例,詳見(jiàn)代碼:
public static class Coder implements Observer {
private String name;
public Coder(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Hi," + name + ",你訂閱的Android前沿技術(shù)有最新發(fā)布,內(nèi)容:" + arg.toString() + ",請(qǐng)前往查看!");
}
}
這里定義了訂閱者的實(shí)現(xiàn)類Coder,它實(shí)現(xiàn)Observer接口,并重寫update方法。
接著是發(fā)布者的具體類,它繼承Observable即可,至于更新方法可自定義,這里是notice:
public static class Publisher extends Observable {
public void notice(String content) {
setChanged();//標(biāo)識(shí)狀態(tài)或內(nèi)容發(fā)生改變
notifyObservers(content);//通知所有訂閱者
}
}
測(cè)試代碼:
public static void main(String[] args) {
Publisher publisher = new Publisher();//創(chuàng)建發(fā)布者
Coder coder_a = new Coder("coder_A");//創(chuàng)建訂閱者
Coder coder_b = new Coder("coder_B");
Coder coder_c = new Coder("coder_C");
publisher.addObserver(coder_a);//將訂閱者注冊(cè)到發(fā)布列表中
publisher.addObserver(coder_b);
publisher.addObserver(coder_c);
publisher.notice("Android注解annotation");//發(fā)布消息
/**
Hi,coder_C,你訂閱的Android前沿技術(shù)有最新發(fā)布,內(nèi)容:Android注解annotation,請(qǐng)前往查看!
Hi,coder_B,你訂閱的Android前沿技術(shù)有最新發(fā)布,內(nèi)容:Android注解annotation,請(qǐng)前往查看!
Hi,coder_A,你訂閱的Android前沿技術(shù)有最新發(fā)布,內(nèi)容:Android注解annotation,請(qǐng)前往查看!
*/
}