设为首页 收藏本站
查看: 667|回复: 0

[经验分享] PHP 的观察者模式(Observer Pattern)

[复制链接]

尚未签到

发表于 2017-4-3 14:35:05 | 显示全部楼层 |阅读模式
  面向过程编程(结构化编程),我们强调的是程序的分块结构和流程处理。进入面向对象(OOP)编程领域之后,设计模式成为一项很重要的技术。设计模式处理的是对象的生成及其协作、依赖、耦合等等关系问题。比如,单例模式保证一个类只能被实例化一次,工厂模式可以依据不同的条件生成相应的类的实例(对象)。而观察者模式则一般用来实现“事件”处理,构造软件的事件处理系统。
  关于观察者模式(Observer)的实现方法,本人在一篇博客文章中论及过(http://blog.why100000.com/?p=744)。但实际上,PHP5.0 以后,SPL(标准PHP库)提供了方便的对观察者模式的支持,特别是 PHP5.2 以后,SPL 的功能得到了很大的扩充。
  观察者模式涉及到两种(两个或多个)类,一个作为被观察对象(subject),另一个作为“观察者”(Observer)。观察者类监视一个或多个观察对象的状态,当其状态变化时,观察者会得到通知。
  为了支持观察者模式,SPL 提供了 SplSubject 和 SplObserver 接口。
  SplSubject 接口提供了 attach()、detach()、notify() 三个方法。而 SplObserver 接口则提供了 update()方法。
  SplSubject 派生类维护了一个状态,当状态发生变化时 - 比如属性变化等,就会调用 notify() 方法,这时,之前在 attach() 方法中注册的所有 SplObserver 实例的 update() 方法就会被调用。
  class SubjectDemo implements SplSubject
{
private $observers, $value;
  public function __construct()
{
//$observers被声明为数组,表示观察者可以有多个
$this->observers = array();
}
  public function attach(SplObserver $observer)
{
$this->observers[] = $observer;
}
  public function detach(SplObserver $observer)
{
if($idx = array_search($observer, $this->observers, true))
unset($this->observers[$idx]);
}
  public function notify()
{
foreach($this->observers as $observer)
$observer->update($this);
}
  public function setValue($value)
{
$this->value = $value;
$this->notify();
}
  public function getValue()
{
return $this->value;
}
  public function getObserversNumber()
{
return count($this->observers);
}
}
  class ObserverDemo1 implements SplObserver
{
public function update(SplSubject $subject)
{
echo 'The new value is '. $subject->getValue() . '<br>';
}
}
  class ObserverDemo2 implements SplObserver
{
public function update(SplSubject $subject)
{
echo 'The Number of Observer(s) is(are) '. $subject->getObserversNumber() . '<br>';
}
}
  $subject = new SubjectDemo();
  $observer1 = new ObserverDemo1();
$observer2 = new ObserverDemo2();
  $subject->attach($observer1);
$subject->attach($observer2);
  $subject->setValue(100);
  从以上代码中看出,观察者可以有多个类。
当 $subject 对象的 setValue() 方法被调用(触发)时,本身被作为参数传递到 $observer1 和 $observer2 对象的 update() 方法中使用。所有观察者的 update() 函数类似事件处理函数。
要扩展事件处理能力,只要从 SplObserver 接口派生一个子类,编写其 update() 函数代码,并附加(attach)到 $subject 对象中即可。
  具体到以上代码,有一个缺陷,就是没有实现不同的事件,用其对应的类来处理。这个不是观察者模式本身的问题,需要结合别的模式来解决。
  作者:张庆(网眼) 西安 PHP 教育培训中心 2010-7-6
来自“网眼视界”:http://blog.why100000.com
作者微博:http://t.qq.com/zhangking
“十万个为什么”电脑学习网:http://www.why100000.com

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359704-1-1.html 上篇帖子: PHP开源加密解密库(带超时) 下篇帖子: php中curl_multi的应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表