`
isiqi
  • 浏览: 16551674 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

PHP 的观察者模式(Observer Pattern)

阅读更多

面向过程编程(结构化编程),我们强调的是程序的分块结构和流程处理。进入面向对象(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

分享到:
评论

相关推荐

    PHP设计模式之观察者模式(Observer)详细介绍和代码实例

    观察者模式是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式经常用于实现软件的分布式事件通知系统,例如,图形...

    php观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它允许对象在状态改变时通知其他对象。在PHP中,这种模式常用于事件驱动编程,使得对象间能进行松耦合的通信。在这个例子中,我们将探讨如何在PHP中...

    PHP 观察者模式深入理解与应用分析

    在软件设计领域,观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在PHP中实现观察者模式...

    php设计模式 Observer(观察者模式)

    观察者模式(Observer Pattern)是其中一种常见模式,它遵循“发布-订阅”原则,用于建立对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖该对象的其他对象都会得到通知,并自动更新它们的状态。 ...

    PHP使用观察者模式处理异常信息的方法详解

    而观察者模式(Observer Pattern)是一种设计模式,它允许对象在其状态改变时通知其他依赖于它的对象。在本文中,我们将深入探讨如何结合这两种概念来优雅地处理PHP中的异常信息。 首先,我们需要了解观察者模式的...

    PHP观察者模式实例分析【对比JS观察者模式】

    以下是一个简单的PHP观察者模式的实现: ```php interface Observer { public function update($data); } class Subject { private $observers = []; public function attach(Observer $observer) { $this-&gt;...

    PHP设计模式精彩剖析

    3. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并更新。 4. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口。 ...

    PHP观察者模式定义与用法实例分析

    观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在PHP中,这种模式通常涉及到一个主题(Subject)对象,它维护了一个...

    PHP 观察者模式的实现代码

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一种订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在PHP中,我们可以利用SPL(Standard PHP Library)提供的`SplSubject`,`...

    PHP实现的观察者模式实例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在PHP中,观察者模式的应用可以帮助我们构建松耦合的系统,使得对象之间的...

    PHP观察者模式原理与简单实现方法示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在PHP中,观察者模式的实现通常涉及两个主要角色:主题(Subject)和观察者...

    PHP设计模式之观察者模式定义与用法示例

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,主要用于对象之间的一对多依赖关系管理。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 在PHP中,观察者模式可以用来...

    PHP设计模式之观察者模式实例

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它允许对象在状态变化时通知其他对象,而无需让这些对象了解导致变化的具体原因。在PHP中,观察者模式常用于实现事件驱动编程,帮助开发者创建松...

    php中的观察者模式简单实例

    观察者模式(Observer Pattern)是软件工程中的一种行为设计模式,属于23种常用设计模式之一。这种模式允许对象之间有一个一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。PHP是一...

    php设计模式全解.rar

    3. 行为型模式:包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento)、状态模式...

    《Learning_PHP设计模式》PDF英文版本下载.txt

    观察者模式(Observer Pattern) 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ##### 应用场景 - 事件处理系统 - 数据模型与视图之间的...

Global site tag (gtag.js) - Google Analytics