当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP设计模式之观察者模式定义与用法分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-15 10:31:31 浏览: 评论:0 

本文实例讲述了PHP设计模式之观察者模式定义与用法,分享给大家供大家参考,具体如下:

观察者模式 当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新

场景:当一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新逻辑增多之后,代码变得难以维护,这种方式是耦合式的,侵入式的,增加新的逻辑需要改变事件主题的代码

观察者模式实现了低耦合,非侵入式的通知与更新

  1. abstract class EventGenerator 
  2.   private $ObServers = []; 
  3.   //增加观察者 
  4.   public function add(ObServer $ObServer
  5.   { 
  6.     $this->ObServers[] = $ObServer
  7.   } 
  8.   //事件通知 
  9.   public function notify() 
  10.   { 
  11.     foreach ($this->ObServers as $ObServer) { 
  12.       $ObServer->update(); 
  13.     } 
  14.   } 
  15. /** 
  16.  * 观察者接口类 
  17.  * Interface ObServer 
  18.  */ 
  19. interface ObServer 
  20.   public function update($event_info = null); 
  21. /** 
  22.  * 观察者1 
  23.  */ 
  24. class ObServer1 implements ObServer 
  25.   public function update($event_info = null) 
  26.   { 
  27.     echo "观察者1 收到执行通知 执行完毕!\n"
  28.   } 
  29. /** 
  30.  * 观察者1 
  31.  */ 
  32. class ObServer2 implements ObServer 
  33.   public function update($event_info = null) 
  34.   { 
  35.     echo "观察者2 收到执行通知 执行完毕!\n"
  36.   } 
  37. /** 
  38.  * 事件 
  39.  * Class Event 
  40.  */ 
  41. class Event extends EventGenerator 
  42.   /** 
  43.    * 触发事件 
  44.    */ 
  45.   public function trigger() 
  46.   { 
  47.     //通知观察者 
  48.     $this->notify(); 
  49.   } 
  50. //创建一个事件 
  51. $event = new Event(); 
  52. //为事件增加旁观者 
  53. $event->add(new ObServer1()); 
  54. $event->add(new ObServer2()); 
  55. //执行事件 通知旁观者 
  56. $event->trigger(); 

运行结果:

观察者1 收到执行通知 执行完毕!

观察者2 收到执行通知 执行完毕!

1 抽象的事件产生类,定义一个添加观察者方法,和通知方法(执行观察者方法)

2 定义观察者接口,实现方法 ,观察者实现

3 定义具体实现类继承抽象事件,实现通知方法

4 创建对象,增加旁观者,更新

具体注册实例

  1. <?php 
  2.  /** 
  3.  * 3.1php设计模式-观测者模式 
  4.  * 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味 
  5.  *     着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候, 
  6.  *     观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间 
  7.  *     紧密耦合的另一种方法 
  8.  * 3.1.2关键点: 
  9.  *    1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件 
  10.  *    2.观察者 ->接受观察方法 
  11.  * 3.1.3缺点: 
  12.  * 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多 
  13.  *    典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等 
  14.  * 3.1.5php内部的支持 
  15.  *    SplSubject 接口,它代表着被观察的对象, 
  16.  *    其结构: 
  17.  *    interface SplSubject 
  18.  *    { 
  19.  *      public function attach(SplObserver $observer); 
  20.  *      public function detach(SplObserver $observer); 
  21.  *      public function notify(); 
  22.  *    } 
  23.  *    SplObserver 接口,它代表着充当观察者的对象, 
  24.  *    其结构: 
  25.  *    interface SplObserver 
  26.  *    { 
  27.  *      public function update(SplSubject $subject); 
  28.  *    } 
  29.  */ 
  30.  /** 
  31.  * 用户登陆-诠释观察者模式 
  32.  */ 
  33. class User implements SplSubject { 
  34.   //注册观察者 
  35.   public $observers = array(); 
  36.   //动作类型 
  37.   CONST OBSERVER_TYPE_REGISTER = 1;//注册 
  38.   CONST OBSERVER_TYPE_EDIT = 2;//编辑 
  39.   /** 
  40.    * 追加观察者 
  41.    * @param SplObserver $observer 观察者 
  42.    * @param int $type 观察类型 
  43.    */ 
  44.   public function attach(SplObserver $observer$type
  45.   { 
  46.     $this->observers[$type][] = $observer
  47.   } 
  48.   /** 
  49.    * 去除观察者 
  50.    * @param SplObserver $observer 观察者 
  51.    * @param int $type 观察类型 
  52.    */ 
  53.   public function detach(SplObserver $observer$type
  54.   { 
  55.     if($idx = array_search($observer$this->observers[$type], true)) 
  56.     { 
  57.       unset($this->observers[$type][$idx]); 
  58.     } 
  59.   } 
  60.   /** 
  61.    * 满足条件时通知观察者 
  62.    * @param int $type 观察类型 
  63.    */ 
  64.   public function notify($type
  65.   { 
  66.     if(!emptyempty($this->observers[$type])) 
  67.     { 
  68.       foreach($this->observers[$typeas $observer
  69.       { 
  70.         $observer->update($this); 
  71.       } 
  72.     } 
  73.   } 
  74.   /** 
  75.    * 添加用户 
  76.    * @param str $username 用户名 
  77.    * @param str $password 密码 
  78.    * @param str $email 邮箱 
  79.    * @return bool 
  80.    */ 
  81.   public function addUser() 
  82.   { 
  83.     //执行sql 
  84.     //数据库插入成功 
  85.     $res = true; 
  86.     //调用通知观察者 
  87.     $this->notify(self::OBSERVER_TYPE_REGISTER); 
  88.     return $res
  89.   } 
  90.   /** 
  91.    * 用户信息编辑 
  92.    * @param str $username 用户名 
  93.    * @param str $password 密码 
  94.    * @param str $email 邮箱 
  95.    * @return bool 
  96.    */ 
  97.   public function editUser() 
  98.   { 
  99.     //执行sql 
  100.     //数据库更新成功 
  101.     $res = true; 
  102.     //调用通知观察者 
  103.     $this->notify(self::OBSERVER_TYPE_EDIT); 
  104.     return $res
  105.   } 
  106. /** 
  107. * 观察者-发送邮件 
  108. */ 
  109. class Send_Mail implements SplObserver 
  110.   /** 
  111.    * 相应被观察者的变更信息 
  112.    * @param SplSubject $subject 
  113.    */ 
  114.   public function update(SplSubject $subject
  115.   { 
  116.     $this->sendMail($subject->email, $title$content); 
  117.   } 
  118.   /** 
  119.    *发送邮件 
  120.    *@param str $email 邮箱地址 
  121.    *@param str $title 邮件标题 
  122.    *@param str $content 邮件内容 
  123.    */ 
  124.   public function sendEmail($email$title$content
  125.   { 
  126.     //调用邮件接口,发送邮件 
  127.   } 
  128. ?>

Tags: PHP设计模式 PHP观察者模式

分享到: