設(shè)計模式之觀察者模式

1. 觀察者模式

  • 觀察者模式(Observer Pattern)
  • 觀察者模式又叫作發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependent)模式
  • 一對多的依賴關(guān)系,一個主題對象可被多個觀察者對象同時監(jiān)聽,每當(dāng)主題對象狀態(tài)變化時,所有依賴它的對象都會得到通知并被自動更新

觀察者模式的核心是將觀察者與被觀察者解耦,以類似消息/廣播發(fā)送的機制聯(lián)動兩者,使被觀察者的變動能通知到感興趣的觀察者們,從而做出相應(yīng)的響應(yīng)

1.1 組成

  • 抽象主題(ISubject):指被觀察的對象(IObservable)
  • 具體主題(ConcreteSubject):具體被觀察者
  • 抽象觀察者(IObserver):定義響應(yīng)通知的更新方法
  • 具體觀察者(ConcreteObserver):當(dāng)?shù)玫綘顟B(tài)更新的通知時,會自動做出響應(yīng)

2. 示例

注冊觀察者,訂閱主題(subject)

/**
 * 主題:被觀察者
 */
public interface ISubject {
    void notify(String event);
    boolean register(IObservable observable);
    boolean remove(IObservable observable);
}
public class ConcreteSubject implements ISubject {

    private List<IObservable> observables = new ArrayList<>();

    @Override
    public boolean register(IObservable observable) {
        return !this.observables.contains(observable) && this.observables.add(observable);
    }

    @Override
    public boolean remove(IObservable observable) {
        return this.observables.remove(observable);
    }

    @Override
    public void notify(String event) {
        for (IObservable observable : this.observables) {
            observable.handler(event);
        }
    }
}

Observer 接口,它將不同的觀察者聚合在一起

/**
 * 觀察者:監(jiān)聽被觀察者的變化
 */
public interface IObservable {
    void handler(String event);
}

public class ConcreteObserverA implements IObservable {
    @Override
    public void handler(String event) {
        System.out.println("concrete observer A: " + event);
    }
}

public class ConcreteObserverB implements IObservable {
    @Override
    public void handler(String event) {
        System.out.println("concrete observer B: " + event);
    }
}

測試:

@Test
public void test() {
    ISubject subject = new ConcreteSubject();
    subject.register(new ConcreteObserverA());
    subject.register(new ConcreteObserverB());
    subject.notify("test");
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容