1. 程式人生 > >PHP 設計模式之觀察者模式

PHP 設計模式之觀察者模式

通知 更新 一對多 改變 變化 variable 它的 all 正常

觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變依賴於主題狀態的對象,卻不必改變主題。——找出程序中會變化的方面,然後將其和固定不變的方面相分離! 主題和觀察者都使用接口:觀察者利用主題的接口向主題註冊,而主題利用觀察者接口通知觀察者。這樣可以讓兩者之間運作正常,又同時具有松耦合的優點! ——針對接口編程,不針對實現編程! 。 觀察者模式利用“組合”將許多觀察者組合進主題中。對象(觀察者——主題)之間的這種關系不是通過繼承產生的,而是在運行時利用組合的方式產生的。 ——多用組合,少用繼承! 代碼
<?php
/** * 觀察者模式 * @author: Mac * @date: 2012/02/22 */ class Paper{ /* 主題 */ private $_observers = array(); public function register($sub){ /* 註冊觀察者 */ $this->_observers[] = $sub; } public function trigger(){ /* 外部統一訪問 */ if(!empty($this->_observers)){
foreach($this->_observers as $observer){ $observer->update(); } } } } /** * 觀察者要實現的接口 */ interface Observerable{ public function update(); } class Subscriber implements Observerable{ public function update(){ echo "Callback\n"
; } }

下面是測試代碼

/* 測試 */ $paper = new Paper(); $paper->register(new Subscriber()); //$paper->register(new Subscriber1()); //$paper->register(new Subscriber2()); $paper->trigger();

總結 當新對象要填入的時候,只需要在主題(又叫可觀察者)中進行註冊(註冊方式很多,你也可以在構造的時候,或者框架訪問的接口中進行註冊),然後實現代碼直接在新對象的接口中進行。這降低了主題對象和觀察者對象的耦合度。

PHP 設計模式之觀察者模式