設計模式-觀察者模式

觀察者(Observer)模式的定義
指多個對象間存在一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。這種模式有時又稱做發佈-訂閱模式、模型-視圖模式,它是對象行爲型模式。spa

觀察者模式是一種對象行爲型模式,其主要優勢以下:code

  • 下降了目標與觀察者之間的耦合關係,二者之間是抽象耦合關係。符合依賴倒置原則。
  • 目標與觀察者之間創建了一套觸發機制。

它的主要缺點以下:server

  • 目標與觀察者之間的依賴關係並無徹底解除,並且有可能出現循環引用。
  • 當觀察者對象不少時,通知的發佈會花費不少時間,影響程序的效率。

模式的結構
觀察者模式的主要角色以下。對象

  • 抽象主題(Subject)角色:也叫抽象目標類,它提供了一個用於保存觀察者對象的彙集類和增長、刪除觀察者對象的方法,以及通知全部觀察者的抽象方法。
  • 具體主題(Concrete Subject)角色:也叫具體目標類,它實現抽象目標中的通知方法,當具體主題的內部狀態發生改變時,通知全部註冊過的觀察者對象。
  • 抽象觀察者(Observer)角色:它是一個抽象類或接口,它包含了一個更新本身的抽象方法,當接到具體主題的更改通知時被調用。
  • 具體觀察者(Concrete Observer)角色:實現抽象觀察者中定義的抽象方法,以便在獲得目標的更改通知時更新自身的狀態。

image.png

//抽象目標
abstract class Subject {
    protected List<Observer> observers = new ArrayList<Observer>();
    //增長觀察者方法
    public void add(Observer observer) {
        observers.add(observer);
    }
    //刪除觀察者方法
    public void remove(Observer observer) {
        observers.remove(observer);
    }
    public abstract void notifyObserver(); //通知觀察者方法
}
//具體目標
class ConcreteSubject extends Subject {
    public void notifyObserver() {
        System.out.println("具體目標發生改變...");
        System.out.println("--------------");
        for (Object obs : observers) {
            ((Observer) obs).response();
        }
    }
}
//抽象觀察者
interface Observer {
    void response(); //反應
}
//具體觀察者1
class ConcreteObserver2 implements Observer {
    public void response() {
        System.out.println("具體觀察者2做出反應!");
    }
}
public class ObserverPattern {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer obs1 = new ConcreteObserver1();
        Observer obs2 = new ConcreteObserver2();
        subject.add(obs1);
        subject.add(obs2);
        subject.notifyObserver();
    }
}

實際案例

image.png

相關文章
相關標籤/搜索