PHP设计模式之观察者模式定义与用法分析
发布:smiling 来源: PHP粉丝网 添加日期:2021-11-15 10:31:31 浏览: 评论:0
本文实例讲述了PHP设计模式之观察者模式定义与用法,分享给大家供大家参考,具体如下:
观察者模式 当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新
场景:当一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新逻辑增多之后,代码变得难以维护,这种方式是耦合式的,侵入式的,增加新的逻辑需要改变事件主题的代码
观察者模式实现了低耦合,非侵入式的通知与更新
- abstract class EventGenerator
- {
- private $ObServers = [];
- //增加观察者
- public function add(ObServer $ObServer)
- {
- $this->ObServers[] = $ObServer;
- }
- //事件通知
- public function notify()
- {
- foreach ($this->ObServers as $ObServer) {
- $ObServer->update();
- }
- }
- }
- /**
- * 观察者接口类
- * Interface ObServer
- */
- interface ObServer
- {
- public function update($event_info = null);
- }
- /**
- * 观察者1
- */
- class ObServer1 implements ObServer
- {
- public function update($event_info = null)
- {
- echo "观察者1 收到执行通知 执行完毕!\n";
- }
- }
- /**
- * 观察者1
- */
- class ObServer2 implements ObServer
- {
- public function update($event_info = null)
- {
- echo "观察者2 收到执行通知 执行完毕!\n";
- }
- }
- /**
- * 事件
- * Class Event
- */
- class Event extends EventGenerator
- {
- /**
- * 触发事件
- */
- public function trigger()
- {
- //通知观察者
- $this->notify();
- }
- }
- //创建一个事件
- $event = new Event();
- //为事件增加旁观者
- $event->add(new ObServer1());
- $event->add(new ObServer2());
- //执行事件 通知旁观者
- $event->trigger();
运行结果:
观察者1 收到执行通知 执行完毕!
观察者2 收到执行通知 执行完毕!
1 抽象的事件产生类,定义一个添加观察者方法,和通知方法(执行观察者方法)
2 定义观察者接口,实现方法 ,观察者实现
3 定义具体实现类继承抽象事件,实现通知方法
4 创建对象,增加旁观者,更新
具体注册实例
- <?php
- /**
- * 3.1php设计模式-观测者模式
- * 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味
- * 着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,
- * 观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间
- * 紧密耦合的另一种方法
- * 3.1.2关键点:
- * 1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件
- * 2.观察者 ->接受观察方法
- * 3.1.3缺点:
- * 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多
- * 典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
- * 3.1.5php内部的支持
- * SplSubject 接口,它代表着被观察的对象,
- * 其结构:
- * interface SplSubject
- * {
- * public function attach(SplObserver $observer);
- * public function detach(SplObserver $observer);
- * public function notify();
- * }
- * SplObserver 接口,它代表着充当观察者的对象,
- * 其结构:
- * interface SplObserver
- * {
- * public function update(SplSubject $subject);
- * }
- */
- /**
- * 用户登陆-诠释观察者模式
- */
- class User implements SplSubject {
- //注册观察者
- public $observers = array();
- //动作类型
- CONST OBSERVER_TYPE_REGISTER = 1;//注册
- CONST OBSERVER_TYPE_EDIT = 2;//编辑
- /**
- * 追加观察者
- * @param SplObserver $observer 观察者
- * @param int $type 观察类型
- */
- public function attach(SplObserver $observer, $type)
- {
- $this->observers[$type][] = $observer;
- }
- /**
- * 去除观察者
- * @param SplObserver $observer 观察者
- * @param int $type 观察类型
- */
- public function detach(SplObserver $observer, $type)
- {
- if($idx = array_search($observer, $this->observers[$type], true))
- {
- unset($this->observers[$type][$idx]);
- }
- }
- /**
- * 满足条件时通知观察者
- * @param int $type 观察类型
- */
- public function notify($type)
- {
- if(!emptyempty($this->observers[$type]))
- {
- foreach($this->observers[$type] as $observer)
- {
- $observer->update($this);
- }
- }
- }
- /**
- * 添加用户
- * @param str $username 用户名
- * @param str $password 密码
- * @param str $email 邮箱
- * @return bool
- */
- public function addUser()
- {
- //执行sql
- //数据库插入成功
- $res = true;
- //调用通知观察者
- $this->notify(self::OBSERVER_TYPE_REGISTER);
- return $res;
- }
- /**
- * 用户信息编辑
- * @param str $username 用户名
- * @param str $password 密码
- * @param str $email 邮箱
- * @return bool
- */
- public function editUser()
- {
- //执行sql
- //数据库更新成功
- $res = true;
- //调用通知观察者
- $this->notify(self::OBSERVER_TYPE_EDIT);
- return $res;
- }
- }
- /**
- * 观察者-发送邮件
- */
- class Send_Mail implements SplObserver
- {
- /**
- * 相应被观察者的变更信息
- * @param SplSubject $subject
- */
- public function update(SplSubject $subject)
- {
- $this->sendMail($subject->email, $title, $content);
- }
- /**
- *发送邮件
- *@param str $email 邮箱地址
- *@param str $title 邮件标题
- *@param str $content 邮件内容
- */
- public function sendEmail($email, $title, $content)
- {
- //调用邮件接口,发送邮件
- }
- }
- ?>
Tags: PHP设计模式 PHP观察者模式
相关文章
- ·php设计模式——单例模式(Singleton)的常见应用场景(2015-04-15)
- ·php 设计模式之单例模式例子(2016-07-27)
- ·PHP设计模式之:单例模式的学习笔记(2016-07-29)
- ·PHP设计模式之:注册模式入门教程(2016-07-29)
- ·PHP设计模式之:适配器模式入门教程(2016-07-29)
- ·PHP设计模式之:数据映射模式教程(2016-07-29)
- ·PHP设计模式之:观察者模式学习笔记(2016-07-29)
- ·PHP常用设计模式之委托设计模式(2021-07-09)
- ·php设计模式之委托模式(2021-07-09)
- ·PHP设计模式之观察者模式实例(2021-07-10)
- ·PHP设计模式之模板方法模式定义与用法详解(2021-09-06)
- ·PHP设计模式之状态模式定义与用法详解(2021-09-06)
- ·PHP设计模式之装饰器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之适配器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之原型模式定义与用法详解(2021-09-06)
- ·PHP设计模式之工厂模式定义与用法详解(2021-09-06)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)