觀察者設(shè)計模式
- 什么是觀察者設(shè)計模式
- 觀察者設(shè)計模式應(yīng)用場景
- 觀察者設(shè)計模式Demo
- 觀察者設(shè)計模式總結(jié)
- 觀察者設(shè)計模式在Android源碼中的應(yīng)用
1. 什么是觀察者設(shè)計模式
觀察者設(shè)計模式是一個結(jié)構(gòu)型模式懦冰。定義對象間一種一對多的關(guān)系溪北,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會收到通知并被自動更新。
2. 觀察者設(shè)計模式應(yīng)用場景
- 多用于實現(xiàn)訂閱功能
3. 觀察者設(shè)計模式Demo
需求
當(dāng)Jay在微博發(fā)布新歌的時候,所有訂閱過Jay微博的歌迷可以自動收到消息提醒。
要實現(xiàn)此功能需要以下幾個角色:
- Observer :觀察者
- ConcreteObserver :具體的觀察者
- Subject : 目標(biāo)
- ConcreteSubject :具體的目標(biāo)
首先建立觀察者<mark>Observer</mark>,如下:
public interface Observer {
void updata();
}
然后建立<mark>Subject</mark>
public interface Subject {
//注冊觀察者
public void register(Observer observer);
//取消注冊
public void unRegister(Observer observer);
//通知觀察者
public void notifyAllFans();
}
創(chuàng)建<mark>Subject</mark>的具體實現(xiàn)類<mark>ConcreteSubject</mark>
public class ConcreteSubject implements Subject{
//將觀察者存入ArrayList
private List<Observer> observerList = new ArrayList<>();
@Override
public void register(Observer observer) {
observerList.add(observer);
}
@Override
public void unRegister(Observer observer) {
if(observerList!=null && observerList.size()>0){
System.out.println("歌迷取消關(guān)注");
observerList.remove(observer);
}
}
@Override
public void notifyAllFans() {
System.out.println("通知:發(fā)布新專輯依然范特西2");
for (Observer observer :observerList){
observer.update();
}
}
}
實現(xiàn)觀察者<mark>ConcreteObserver1</mark>和<mark>ConcreteObserver2</mark>
public class ConcreteObserver1 implements Observer {
@Override
public void update() {
System.out.println("歌迷:ConcreteObserver1 收到通知");
}
}
public class ConcreteObserver2 implements Observer {
@Override
public void update() {
System.out.println("歌迷:ConcreteObserver2 收到通知");
}
}
將<mark>ConcreteObserver1</mark>和<mark>ConcreteObserver2</mark>注冊為觀察者:
public class SongConference {
public static void main(String[] args){
ConcreteSubject concreteSubject = new ConcreteSubject();
ConcreteObserver1 observer1 = new ConcreteObserver1();
ConcreteObserver2 observer2 = new ConcreteObserver2();
//注冊為觀察者
concreteSubject.register(observer1);
//注冊為觀察者
concreteSubject.register(observer2);
concreteSubject.notifyAllFans();
//取消注冊為觀察者
concreteSubject.unRegister(observer2);
concreteSubject.notifyAllFans();
}
}
打印結(jié)果:
通知:發(fā)布新專輯依然范特西2
歌迷:ConcreteObserver1 收到通知
歌迷:ConcreteObserver2 收到通知
通知:發(fā)布新專輯依然范特西2
歌迷:ConcreteObserver1 收到通知
4. 觀察者設(shè)計模式總結(jié)
優(yōu)點
- 觀察者與被觀察者之間是抽象耦合笔刹,應(yīng)對業(yè)務(wù)變化
- 增強系統(tǒng)的靈活性、可擴展性
- 符合開閉原則
缺點
需要考慮開發(fā)效率和運行效率的問題冬耿,程序中包含一個被觀察者舌菜、多個觀察者,開發(fā)和調(diào)試等內(nèi)容會比較復(fù)雜亦镶,而且在java中消息的通知默認(rèn)是按照順序執(zhí)行日月,一個觀察者卡頓,會影響整體的執(zhí)行效率缤骨,在這種情況下一般考慮采用異步的方式爱咬。