php中的设计模式之--观察者模式

来源:互联网 发布:淘宝店铺二维码在哪 编辑:程序博客网 时间:2024/04/30 05:45
<?php  /**  1. 概述  又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式2. 解决的问题  将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。3. 模式中的角色  3.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。  3.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。  3.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。  3.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。4 . 简单的来说观察者模式有两个角色(主题和观察者),其中主题可以理解万为被观察者; 如果主题发生变化,就会通知观察者,观察者就会更新自己; 举例说明 ,花(具体对象,或者被观察者) 养花的人就是观察者,如果花发生变化(叶子枯萎需要浇水),观察者就会做出反应浇花; */ //(1)抽象主题(Subject)interface  Subject {// 添加观察者public function attach(Observer $observer)  ;// 删除观察者 public function detach(Observer $observer);//向观察者(们)发出通知public function notify();}// (2) 抽象观察者interface Observer{// 更新方法 public function dosometing(); }// 具体的花作为主体class Flower implements Subject{// 此为所有的观察者对象数组 private $observers = NULL ;   // 添加观察者(看花的人) public function attach(Observer $observer) {$this->observers[] = $observer ;}  // 删除观察者 (看花的人)public function detach(Observer $observer){if(in_array($observer,$this->observers)){$index = array_search($observer, $this->observers);    unset($this->observers[$index]);            return TRUE;}return false; }//向观察者(们)发出通知public function notify(){foreach($this->observers as $observer){$observer->dosometing(); }}}// 具体的人 class LoveFlowerPerson implements Observer{ private $name  ; function __construct($sName){ $this->name =$sName ; } public function dosometing(){   echo  $this->name.'浇花  '; } }/* 添加第一个观察者花农 */$subject = new Flower();$observer1 = new LoveFlowerPerson('wlt');$subject->attach($observer1);<pre name="code" class="php">/* 添加第二个观察者花农 */
$observer2 = new LoveFlowerPerson('wlb');$subject->attach($observer2);$subject->notify(); // 主题变化,通知观察者echo '删除掉一个花农 <br>'; $subject->detach($observer2);$subject->notify(); // 主题变化,通知观察者

0 0
原创粉丝点击