概念
觀察者模式屬於行為模式,是定義物件間的一種一對多的依賴關係,以便當一個物件的狀態改變時,所有依賴它的物件都會被通知並自動刷新。
當一個物件狀態改變後,會影響到其他幾個物件的改變,這時候可以用觀察者模式。
觀察者模式符合介面隔離原則,實現了物件之間的鬆散耦合。
別名
發布-訂閱
模型-視圖
源-收聽者
觀察者物件的引用保存到一個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。
具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。
抽象觀察者(Observer):為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。
具體觀察者(ConcreteObserver):實作抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調。
UML圖
程式碼範例程式碼
在PHP SPL中已經提供SplSubject和SqlOberverrroo運行結果
資料量加10
積分量加10積分量加10
度和缺點優點
觀察者和主題之間的優點耦合和缺點
優點
由於觀察者並不知道其它觀察者的存在,它可能對改變目標的最終代價一無所知。這可能會引起意外的更新。
適用場景
當一個抽像模型有兩個方面,其中一個方面依賴另一個方面。
當對一個對象的改變需要同時改變其它對象,而不知道具體有多少個對象待改變。
當一個對象必須通知其它對象,而它又不能假定其它對像是誰。換句話說,你不希望這些物件是緊密耦合的。