标签:function php observer Observer watch 观察者 设计模式 public
观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
理解:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
场景:比如用户注册后需要增加一个邮件推送的功能,过几天加送优惠券的功能,这时将代码都写在登录里就非常的偶尔的,或者比如要根据用户不同的角色给出不同的处理方式(势利眼的观察者看人下菜)
,这些都可以使用观察者模式。
// 被观察者接口
interface Subject{
public function register(Observer $observer); //添加(注册)观察者对象
public function detach(Observer $observer); //删除观察者对象
public function notify(); //通知观察者执行相应功能
}
// 观察者接口
interface Observer{
public function watch(); //观察者要执行的方法
}
// 被观察者继承类
class Action implements Subject{
public $_observers=array(); //用于存储观察者对象
//用于添加(注册)观察者对象
public function register(Observer $observer){
$this->_observers[]=$observer;
}
//用于删除观察者对象
public function detach(Observer $observer){
$index = array_search($observer, $this->_observers);
if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
return FALSE;
}
unset($this->_observers[$index]);
return TRUE;
}
//通知各观察者
public function notify(){
//****重点,其实就是循环中执行各观察这对象的watch方法,不同功能方法内容不同但方法名相同
foreach ($this->_observers as $observer) {
$observer->watch();
}
}
}
// cat观察者继承类
class Cat implements Observer{
public function watch(){
echo "Cat likes fish <hr/>";
}
}
//dog观察者继承类
class Dog implements Observer{
public function watch(){
echo "Dog likes ball<hr/>";
}
}
//people观察者继承类
class People implements Observer{
public function watch(){
echo "People likes mobile<hr/>";
}
}
// 应用实例
//创建一个事件
$action=new Action();
//为事件增加旁观者
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
//执行事件 通知旁观者
$action->notify();
观察者就是定义各种功能的对象,如给第一次登录的用户发红包,给用户最新的10条文章推送,给非vip用户推送10条需要注册才能打开的视频诱导用户开通vip,
一个规则就是一个观察者,增加新规则就增加新观察者
,被观察者对象要实现的就是 将添加(注册)的观察者对象存储起来并逐个通知执行观察者各自的功能
参考自:https://www.cnblogs.com/onephp/p/6108344.html
标签:function,php,observer,Observer,watch,观察者,设计模式,public 来源: https://blog.csdn.net/xiantianga6883/article/details/122684866
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。