源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

php设计模式之观察者模式的应用详解

  • 时间:2022-03-26 12:06 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:php设计模式之观察者模式的应用详解
[b]观察者模式:[/b]定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 [b]观察者类: [/b]1.抽象主题角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以任意多个观察者。抽象主题提供了增加和删除观察者对象的接口。 2.抽象观察者角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己 3.具体主题角色:存储相关状态到具体观察者对象,当具体主题的内部状态发生改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。 4.具体观察者角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致 [b]作用: [/b]1. 观察者模式的耦合度较小 2.支持广播通信
[u]复制代码[/u] 代码如下:
<?php //抽象主题 interface Subject{      public function attach($observer);      public function detach($observer);      public function notifyObservers(); } //具体主题 class ConcreateSubject implements Subject{      private $_observers;      public function __construct(){           $this->_observers = array();      }      public function attach($observer){           return array_push($this->_observers,$observer);      }      public function detach($observer){           $index = array_search($observer,$this->_observers);           if($index === false || !array_key_exists($index,$this->_observers)){                return false;           }           unset($this->_observer[$index]);           return true;      }      public function notifyObservers(){           if(!is_array($this->_observers)){                return false;           }           foreach($this->_observers as $observer){                $observer->update();           }           return true;      } } //抽象观察者 interface Observer{      public function update(); } //具体观察者 class ConcreteObserver implement Observer{      private $_name;      public function __construct($name){           $this->_name = $name;      }      public function update(){           echo 'Observer',$this->_name.'has notified<br/>';      } } //客户端 class Client{      public static function main(){             $subject = new ConcreteSubject();             //新增第一个观察者             $observer1 = new ConcreteObserver('Martin');             $subject->attach($observer1);             //通知             $subject->notifyObservers();             //新增第二个观察者             $observer2 = new ConcreteObserver('jaky');             $subject->attach($observer2);             //通知             $subject->notifyObservers();             //删除观察者1             $subject->deatch($observer1);             //通知             $subject->notifyObservers();      } } Client::main(); ?>
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部