源代碼
GitHub源代碼
1.本文目標(biāo)
本文目標(biāo)是為了讓大家認(rèn)識(shí)并理解觀察者模式
2.基本套路
定義:定義了對(duì)象之間的一對(duì)多依賴,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)主題對(duì)象發(fā)生變化時(shí),它的所有觀察者都會(huì)收到通知并更新
類型:行為型
選擇關(guān)鍵點(diǎn):觀察者與被觀察者是否是多對(duì)一的關(guān)系
設(shè)計(jì)原則:遵循迪米特、開閉原則
使用概率:40%
難度系數(shù):中
3.適用場(chǎng)景
1.關(guān)聯(lián)行為場(chǎng)景,建立一套觸發(fā)機(jī)制
4.使用步驟
用栗子能更好的說明問題,請(qǐng)繼續(xù)往下看
5.舉個(gè)栗子
我們用具體的代碼去更好的理解這個(gè)設(shè)計(jì)模式
5.1栗子說明
- 背景:我有好幾個(gè)女朋友,一直觀察著我,我去夜店觀察我,去泡吧也觀察我
- 目的:用觀察者模式模擬女朋友觀察我,然后我是被觀察者,我去干什么事兒都主動(dòng)通知女朋友們
5.2使用步驟
實(shí)現(xiàn)代碼如下:
步驟1.創(chuàng)建觀察者,女朋友們 是觀察者
public interface Observer {
void update(String state);
}
步驟2.創(chuàng)建我的其中一個(gè)女朋友,觀察者的一個(gè)子類 實(shí)現(xiàn)類
public class GirlFriendObserver implements Observer {
private String name;
public String getName() {
return name;
}
public GirlFriendObserver(String name) {
super();
this.name = name;
}
@Override
public void update(String state) {
System.out.println(name + "接到最新消息,男朋友最新狀態(tài):" + state);
}
}
步驟3.創(chuàng)建被觀察者 ,我自己
public abstract class Observable {
private ArrayList<Observer> observers = new ArrayList<Observer>();
/**
* 添加一個(gè)觀察者
*/
public void attach(Observer observer) {
observers.add(observer);
System.out.println("我新交了一個(gè)女朋友");
}
/**
*去掉一個(gè)觀察者
*/
public void dettch(Observer observer) {
observers.remove(observer);
System.out.println("我和她分手了");
}
/**
* 通知觀察者(就是通知我的女朋友們)
*/
public void notyfyObservers(String state) {
for (Observer observer : observers) {
observer.update(state);
}
}
}
步驟4. 創(chuàng)建被觀察者的 子類
public class MessageObservable extends Observable {
public void change(String state) {
notyfyObservers(state);
}
}
步驟5. 測(cè)試,女朋友是觀察者,我是被觀察者,現(xiàn)實(shí)中是觀察者一直觀察被觀察者,如果我去泡吧了,直接分手叮盘。在代碼中,是被觀察者主動(dòng)告訴觀察者,我去泡吧了或者大保健了,然后分手违诗。這樣可以減少資源的不必要的浪費(fèi),提高性能
public static void main(String[] args) {
//創(chuàng)建2個(gè)觀察者
Observer fanbingbing = new GirlFriendObserver("范冰冰");
Observer yangmi = new GirlFriendObserver("楊冪");
//創(chuàng)建被觀察者
MessageObservable messageSubject = new MessageObservable();
//被觀察者 添加 觀察者 到集合中
messageSubject.attach(fanbingbing);
messageSubject.attach(yangmi);
//被觀察者 通知 觀察者,我都干了什么
messageSubject.change("我在大保健");
messageSubject.dettch(yangmi);
messageSubject.notyfyObservers("泡吧");
}
6.優(yōu)點(diǎn)
- 觀察者和被觀察者之間建立一個(gè)抽象的耦合
- 觀察者模式支持廣播通信
7.缺點(diǎn)
- 觀察者之間有過多的細(xì)節(jié)依賴,提高時(shí)間消耗和程序復(fù)雜度
- 使用要得當(dāng),要避免循環(huán)調(diào)用
8.總結(jié)
本文只是對(duì)觀察者模式進(jìn)行一個(gè)分享,接下來會(huì)從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類展開一個(gè)系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦策添。