麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > PHP > 正文

PHP設計模式之觀察者模式實例

2024-05-04 23:43:12
字體:
來源:轉載
供稿:網友
一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。通過本文給大家介紹PHP設計模式之觀察者模式,需要的朋友參考下
 

首先了解觀察者模式的概念:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對象無關。結果是對象可以相互對話,而不必了解原因。觀察者模式是一種事件系統,意味著這一模式允許某個類觀察另一個類的狀態(tài),當被觀察的類狀態(tài)發(fā)生改變的時候,觀察類可以收到通知并且做出相應的動作;觀察者模式為您提供了避免組件之間緊密耦。

UML結構圖:

PHP設計模式之觀察者模式實例

觀察者模式解決的問題

在我們的開發(fā)過程中,應該都或多或少的碰到過改動其中一部分代碼會引起其他一連串改變的問題,顯然想要完全避免這種情況不太可能,但我們也應答盡量減少對其他組件的依賴,而觀察者模式就是為了解決這個問題。

舉個例子來說,我們有一個帖子對象,代碼如下:

class Post{protected $_userid = null;protected $_ip = null;protected $_content = null;function __construct(){// ...}// 發(fā)帖方法public function addPost(){// ... 發(fā)帖邏輯}}

在上面是一個普通的帖子對象,隨著發(fā)帖量和訪問量越來越大,運營們開始不干了,公司也經常會接到投訴電話,說我們的網站有許多敏感內容和垃圾廣告,因此我們需要做內容審核:首先是對用戶的審核,一些黑名單用戶應該被禁止發(fā)帖;二是對IP的審核;三是對內容敏感詞的審核。因此我們的代碼就成了如下的樣子:

class Post{protected $_userid = null;protected $_ip = null;protected $_content = null;function __construct(){}public function addPost(){if (!Postscan::checkUserid($tihs->_userid)) {return false;}if (!Postscan::ipUserid($tihs->_ip)) {return false;}if (!Postscan::checkContent($tihs->_content)) {return false;}// ... }}

隨著需要審核的字段越來越多,addPost方法變得越來越長,發(fā)布對象被也只能緊緊的被嵌入到該系統中。

觀察者模式的實現

觀察者模式的核心是把觀察者從主體中分離開來,當主體知道事件發(fā)生時,觀察需要被通知到,同時我們也不想把主體和觀察者之間的關系寫死,于是我們來修改下我們上面的代碼:

//主體必須實現的接口interface Observable {public function attach(Observer $observer);public function detach(Observer $observer);public function notify();}//觀察者必須實現的接口interface Observer {public function do(Observable $subject);}class Post implements Observable{protected $_userid = null;protected $_ip = null;protected $_content = null;protected $_observerlist = array();function __construct(){}public function attach(Observer $observer){$this->_observerlist[] = $observer;}public function detach(Observer $observer){foreach ($this->_observerlist as $key => $value) {if ($observer === $value) {unset($this->_observerlist[$key])}}}public function notify(){foreach ($this->_observerlist as $value) {if (!$value->do($this)) {return false;}}return true;}public function addPost(){if (!$this->notify()) {return false;}// ... }}

通過上面的代碼,我們可以再很容易的加入審核規(guī)則。

SPL代碼

觀察者模式是一個很常見和常用的設計模式,以至于SPL擴展已經為我們封裝好了對應的類和方法,下面的代碼是根據SPL提供的3個元素:SplObserver,SplSubject,SplObjectStorage來實現的代碼

class Post implements SplSubject{protected $_userid = null;protected $_ip = null;protected $_content = null;protected $_storage = new SplObjectStorage();function __construct(){}public function attach(SplObject $observer){$this->_storage->attach($observer);}public function detach(SplObject $observer){$this->_storage->detach($observer);}public function notify(){foreach ($this->_storage as $value) {if (!$value->update($this)) {return false;}}return true;}public function addPost(){if (!$this->notify()) {return false;}// ... }}

很簡單吧,最重要的是理解,在這個例子中,我們把一些審核的方法從帖子類中剝離了開來,而且該帖子對象也可以用來作為其他的發(fā)布類型。

以上內容實現是小編給大家介紹的PHP設計模式之觀察者模式,希望對大家有所幫助!



注:相關教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品一区二区三区日本 | 日韩中文字幕一区二区三区 | 看毛片免费 | 国产91久久久久 | 欧美激情视频一区二区免费 | 亚洲一区 国产精品 | 超碰97最新 | 国产精品久久久久久久av | 欧美大胆xxxx肉体摄影 | 亚洲免费在线看 | 国产日韩亚洲 | 成人444kkkk在线观看 | 97香蕉超级碰碰久久免费软件 | 欧美视频一二三区 | 成人在线网站 | 韩国草草影院 | 欧洲黄视频 | 免费毛片观看 | av播播| 九九热精品视频在线免费观看 | 国产一国产精品一级毛片 | 91九色精品国产 | 最近中文字幕一区二区 | 全黄性性激高免费视频 | 日韩视频一二三 | 天堂在线资源av | xxxx hd videos| 久久久青青草 | 欧美人xx| 国产xxxx岁13xxxxhd | 久久久婷婷一区二区三区不卡 | 日韩在线毛片 | 成人在线观看一区二区三区 | 黄色av网站免费看 | 黄色av网站在线观看 | 欧美国产一级片 | 国产精品手机在线亚洲 | 91在线视频网址 | 91精品国产91久久久 | 久久成人综合视频 | 国产精品久久久久久久久久久天堂 |