wordpress會(huì)員瀏覽網(wǎng)站排名優(yōu)化推廣
引言
模式角色
UML圖
示例代碼
應(yīng)用場(chǎng)景
優(yōu)點(diǎn)
缺點(diǎn)
結(jié)論
引言
觀(guān)察者模式(Observer Pattern)是一種行為設(shè)計(jì)模式,它定義了對(duì)象之間的一對(duì)多依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都會(huì)得到通知并自動(dòng)更新。這種模式非常適合實(shí)現(xiàn)分布式事件處理系統(tǒng),如用戶(hù)界面中的事件驅(qū)動(dòng)機(jī)制。
模式角色
- Subject(被觀(guān)察者/主題):也稱(chēng)為可觀(guān)察者,它包含了一個(gè)或多個(gè)觀(guān)察者的引用,并提供注冊(cè)、移除和通知觀(guān)察者的方法。
- Observer(觀(guān)察者):定義了一個(gè)更新接口,用于接收來(lái)自被觀(guān)察者的更新信息。
- ConcreteSubject(具體的被觀(guān)察者):實(shí)現(xiàn)了Subject接口,維護(hù)著狀態(tài),并在狀態(tài)改變時(shí)通知所有已注冊(cè)的觀(guān)察者。
- ConcreteObserver(具體的觀(guān)察者):實(shí)現(xiàn)了Observer接口,當(dāng)收到更新通知時(shí)執(zhí)行具體的操作。
UML圖
+-------------------+ +------------------+
| Subject |<-------->| Observer |
+-------------------+ +------------------+
| -observers: List | | + update() |
+-------------------+ +------------------+
| + attach(observer)|
| + detach(observer)|
| + notifyObservers()|
+-------------------+^||
+-------------------+
|ConcreteSubject |
+-------------------+
| + state |
| + setState(state) |
+-------------------+
示例代碼
以下是一個(gè)簡(jiǎn)單的Java實(shí)現(xiàn)示例:
import java.util.ArrayList;
import java.util.List;// Observer 接口
interface Observer {void update(String message);
}// ConcreteObserver 類(lèi)
class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}// Subject 接口
interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers(String message);
}// ConcreteSubject 類(lèi)
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String state;@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}public void changeState(String newState) {this.state = newState;notifyObservers(newState);}
}// 客戶(hù)端代碼
public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.attach(observer1);subject.attach(observer2);subject.changeState("New State");subject.detach(observer1);subject.changeState("Updated State");}
}
應(yīng)用場(chǎng)景
- GUI事件處理:比如按鈕點(diǎn)擊事件,窗口關(guān)閉事件等。
- 股票市場(chǎng):股票價(jià)格變動(dòng)可以通知訂閱該股票的所有投資者。
- 系統(tǒng)監(jiān)控:服務(wù)器性能指標(biāo)變化時(shí)通知管理員。
- RSS訂閱:博客更新時(shí)通知所有訂閱者。
優(yōu)點(diǎn)
- 松耦合:被觀(guān)察者與觀(guān)察者之間是抽象耦合,兩者無(wú)需知道對(duì)方的具體實(shí)現(xiàn)。
- 易于擴(kuò)展:添加新的觀(guān)察者不需要修改現(xiàn)有代碼,符合開(kāi)閉原則。
缺點(diǎn)
- 如果觀(guān)察者數(shù)量過(guò)多,可能會(huì)導(dǎo)致性能問(wèn)題。
- 更新順序不可控:觀(guān)察者接收到的通知順序可能無(wú)法保證。
結(jié)論
觀(guān)察者模式是一種非常實(shí)用的設(shè)計(jì)模式,特別適用于需要?jiǎng)討B(tài)地將對(duì)象關(guān)聯(lián)起來(lái)的情況。通過(guò)使用這種模式,我們可以使應(yīng)用程序更加靈活且易于維護(hù)。