Java設(shè)計(jì)模式-觀察者模式
簡(jiǎn)介
設(shè)計(jì)模式在軟件開發(fā)中起著重要的作用,觀察者模式是其中一種常見的模式。觀察者模式是一種行為設(shè)計(jì)模式,它建立了一種對(duì)象間的一對(duì)多依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),它的所有依賴對(duì)象都將得到通知并自動(dòng)更新。在觀察者模式中,存在兩種角色:主題(Subject)和觀察者(Observer)。主題維護(hù)著一個(gè)觀察者列表,而觀察者則注冊(cè)到主題上以接收狀態(tài)變化的通知。
與其他設(shè)計(jì)模式相比,觀察者模式主要關(guān)注對(duì)象間的通信機(jī)制。觀察者模式與一些其他常見設(shè)計(jì)模式的區(qū)別:
單例模式:?jiǎn)卫J疥P(guān)注的是如何確保一個(gè)類只有一個(gè)實(shí)例,而觀察者模式關(guān)注的是對(duì)象之間的通信和協(xié)作。
工廠模式:工廠模式側(cè)重于創(chuàng)建對(duì)象,而觀察者模式則側(cè)重于對(duì)象之間的關(guān)系和通信。
策略模式:策略模式關(guān)注的是在運(yùn)行時(shí)選擇算法,而觀察者模式關(guān)注的是對(duì)象之間的狀態(tài)變化。
實(shí)現(xiàn)
在Java中,可以使用內(nèi)置的觀察者模式支持來實(shí)現(xiàn)觀察者模式。下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)示例:
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
// 主題類
class Subject extends Observable {
? ?private int state;
? ?public int getState() {
? ? ? ?return state;
? ?}
? ?public void setState(int state) {
? ? ? ?this.state = state;
? ? ? ?setChanged(); // 標(biāo)記狀態(tài)已改變
? ? ? ?notifyObservers(); // 通知觀察者
? ?}
}
// 觀察者類
class ObserverImpl implements Observer {
? ?@Override
? ?public void update(Observable o, Object arg) {
? ? ? ?// 執(zhí)行觀察者邏輯
? ? ? ?System.out.println("狀態(tài)已更新:" + ((Subject) o).getState());
? ?}
}
// 示例代碼
public class ObserverPatternExample {
? ?public static void main(String[] args) {
? ? ? ?Subject subject = new Subject();
? ? ? ?Observer observer = new ObserverImpl();
? ? ? ?subject.addObserver(observer); // 注冊(cè)觀察者
? ? ? ?subject.setState(1); // 狀態(tài)更新,觸發(fā)通知
? ?}
}
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
解耦性:主題和觀察者之間是松耦合的,它們可以獨(dú)立地進(jìn)行擴(kuò)展和修改。
可重用性:可以方便地添加新的觀察者來擴(kuò)展功能。
靈活性:主題和觀察者之間的通信是動(dòng)態(tài)的,可以在運(yùn)行時(shí)添加或刪除觀察者。
缺點(diǎn)
內(nèi)存泄漏:如果觀察者沒有正確地解注冊(cè),可能導(dǎo)致內(nèi)存泄漏問題。
更新順序:觀察者的更新順序是不確定的,可能導(dǎo)致一些問題。
運(yùn)用場(chǎng)景
觀察者模式在以下情況下非常適用:
當(dāng)一個(gè)對(duì)象的狀態(tài)改變需要通知其他對(duì)象,并且不希望與這些對(duì)象之間產(chǎn)生緊耦合關(guān)系時(shí)。
當(dāng)一個(gè)對(duì)象的改變需要觸發(fā)其他對(duì)象的更新操作時(shí)。
當(dāng)系統(tǒng)需要在運(yùn)行時(shí)動(dòng)態(tài)地將觀察者添加到主題中時(shí)。