学习PHP设计模式中的观察者模式需要掌握以下知识点:
- 观察者模式是怎样的一种设计模式,以及它的应用场景和作用;
- 观察者模式中的关键角色:被观察者(Subject)和观察者(Observer);
- 实现观察者模式的具体步骤:定义被观察者和观察者的接口,实现被观察者和观察者的类及其方法。
以下是实现观察者模式的完整攻略:
观察者模式概述
观察者模式是一种常见的行为型设计模式,它用于在对象之间定义一种一对多的依赖关系,这样当一个对象状态发生改变时,所有依赖它的对象都能够得到通知并自动更新。
在实际应用中,观察者模式通常被用于实现事件处理、消息推送、状态更新等功能。
观察者模式中的角色
在观察者模式中,通常有以下几种角色:
- Subject(被观察者):定义用于添加、移除和通知观察者的方法;
- Observer(观察者):定义用于接收被观察者状态变化通知的方法;
- ConcreteSubject(具体被观察者):实现Subject接口,它具有可以被监测的属性和状态,并在状态发生变化时通知Observer;
- ConcreteObserver(具体观察者):实现Observer接口,它接收Subject状态变化通知并做出相应的响应。
实现观察者模式的步骤
- 定义Subject和Observer接口
interface Subject {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
interface Observer {
public function update(Subject $subject);
}
- 实现ConcreteSubject类
class ConcreteSubject implements Subject {
private $observers = [];
private $state;
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
foreach ($this->observers as $key => $value) {
if ($value == $observer) {
unset($this->observers[$key]);
}
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setState($state) {
$this->state = $state;
$this->notify();
}
public function getState() {
return $this->state;
}
}
- 实现ConcreteObserver类
class ConcreteObserver implements Observer {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function update(Subject $subject) {
echo "{$this->name}观察到{$subject->getState()} 发生了变化<br>";
}
}
- 示例说明
// 创建被观察者
$subject = new ConcreteSubject();
// 添加观察者
$observer1 = new ConcreteObserver('小明');
$observer2 = new ConcreteObserver('小红');
$subject->attach($observer1);
$subject->attach($observer2);
// 被观察者状态变化,并通知观察者
$subject->setState('测试状态1');
// 移除观察者
$subject->detach($observer2);
// 被观察者状态变化,并通知观察者
$subject->setState('测试状态2');
以上示例的输出结果为:
小明观察到测试状态1 发生了变化
小红观察到测试状态1 发生了变化
小明观察到测试状态2 发生了变化
根据输出结果可以看到,当被观察者的状态发生变化时,两个观察者对象都能够接收到通知并做出相应的响应。并且当一个观察者被移除时,不再接收到通知。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现观察者模式(Observer) - Python技术站