在我們的開發過程中,應該都或多或少的碰到過改動其中一部分**會引起其他一連串改變的問題,顯然想要完全避免這種情況不太可能,但我們也應答儘量減少對其他元件的依賴,而觀察者模式就是為了解決這個問題。
舉個例子來說,我們有乙個帖子物件,**如下:
class post
// 發帖方法
public function addpost()
}
class post
public function addpost()
if (!postscan::ipuserid($tihs->_ip))
if (!postscan::checkcontent($tihs->_content))
// ...
}}
隨著需要審核的字段越來越多,addpost方法變得越來越長,發布物件被也只能緊緊的被嵌入到該系統中。
觀察者模式的核心是把觀察者從主體中分離開來,當主體知道事件發生時,觀察需要被通知到,同時我們也不想把主體和觀察者之間的關係寫死,於是我們來修改下我們上面的**:
//主體必須實現的介面
inte***ce observable
//觀察者必須實現的介面
inte***ce observer
class post implements observable
public function attach(observer $observer)
public function detach(observer $observer)}}
public function notify()
}return true;
}public function addpost()
// ...
}}
通過上面的**,我們可以再很容易的加入審核規則。
觀察者模式是乙個很常見和常用的設計模式,以至於spl擴充套件已經為我們封裝好了對應的類和方法,下面的**是根據spl提供的3個元素:splobserver,splsubject,splobjectstorage來實現的**
class post implements splsubject
public function attach(splobject $observer)
public function detach(splobject $observer)
public function notify()
}return true;
}public function addpost()
// ...
}}
很簡單吧,最重要的是理解,在這個例子中,我們把一些審核的方法從帖子類中剝離了開來,而且該帖子物件也可以用來作為其他的發布型別。 php設計模式之 觀察者模式
觀察者模式 observer 當乙個物件狀態發生改變時,依賴它的物件全部收到通知,並自動更新。抽象被觀察者 abstract class eventgenerator 通知所有觀察者 public function notify 具體被觀察者class event extends eventgene...
PHP 設計模式之觀察者模式
介紹現在有兩派,有的人建議使用設計模式,有的人不建議使用設計模式!這就向寫文章一樣,有的人喜歡文章按照套路走,比如敘事性質的文章,時間,地點,人物,事件。而有的人喜歡寫雜文或者散文,有的人喜歡寫詩詞!很多時候,我看設計模式的時候,有些設計模式只是吻合我的 習慣。但是你硬去套它,那麼反而適得其反。很多...
php 設計模式之觀察者模式
觀察者模式 1.抽象事件發生類 abstract class eventgenerator 對 所有 觀察者 進行 事件 通知 function notify 2.宣告具體事件類 class event extends eventgenerator 3.宣告 乙個 觀察者 介面 inte ce ob...