代码如下所示:复制代码 代码如下://被察者抽象类class Observed implements SplSubject{ protected $_name; protected $_observers;
//实例化,生成一个观察者对象 public function __construct(){ $this->_observers = new SplObjectStorage(); }
// 添加观察者对象 public function attach(SplObserver $observer){ $this->_
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一种订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在PHP中,我们可以利用SPL(Standard PHP Library)提供的`SplSubject`,`SplObserver`接口来实现这个模式。
在给出的代码中,`Observed`类作为被观察者,实现了`SplSubject`接口。这个接口要求类必须有以下方法:
1. `attach(SplObserver $observer)`:用于添加观察者。
2. `detach(SplObserver $observer)`:用于移除观察者。
3. `notify()`:用于通知所有已注册的观察者。
`Observed`类还包含了`setName()`和`setAge()`方法,当这些方法被调用时,它们会触发`notify()`,从而通知观察者们对象的状态已经发生了变化。
`Observer`类作为观察者,实现了`SplObserver`接口,需要实现`update(SplSubject $subject)`方法。在这个例子中,`Observer`类还有两个自定义方法:`showMessage(SplSubject $obj)`和`showAge($name, $age)`,分别用于显示不同类型的观察者行为。
当我们创建`Observed`对象(被观察者)并添加`Observer`对象(观察者)后,任何对`Observed`对象状态的修改都会触发`notify()`,进而调用`Observer`对象的`showMessage()`或`showAge()`方法,展示相应的响应。
在实际应用中,观察者模式常用于事件驱动编程,例如在用户登录系统中,用户登录成功(状态变化)可以触发邮件通知(观察者)发送欢迎邮件,或者在电子商务网站上,商品价格变动(状态变化)可以通知关注该商品的用户(观察者)。
观察者模式的核心优点在于它实现了对象之间的松耦合。被观察者不需要知道具体的观察者是谁,只需要知道当状态变化时需要通知谁。同样,观察者也不必了解被观察者的具体实现,只需实现一个统一的更新接口即可。这种模式使得系统更加灵活,易于扩展,能够更好地应对需求变化。