博客
关于我
PHP设计模式:观察者模式
阅读量:793 次
发布时间:2023-03-02

本文共 2084 字,大约阅读时间需要 6 分钟。

观察者模式简介

观察者模式(Observer)通过将观察者与被观察对象分离开,实现了近年来在软件设计中的重要突破。以用户界面为观察者,业务数据为被观察对象的例子举例说明:当业务数据发生变化时,用户界面能够自动刷新以反映最新信息。这种设计模式在面向对象编程中具有重要意义,它强调每个类应专注于特定功能,避免承担多余责任。通过在模块间划清界限,观察者模式不仅提升了代码的可维护性,还便于实现代码的高重用性。

观察者模式定义了一对多的依赖关系,确保被观察对象的状态变化时,所有相关的观察者能够及时接收到通知并进行相应更新。这一机制使得系统能够在发生状态变化时,自动触发必要的更新操作,从而维护了系统的响应速度和一致性。

观察者模式在PHP中的实现可通过内置的SplSubject和SplObserver接口来完成。这些接口定义了两个核心角色:被观察对象(SplSubject)和观察者(SplObserver)。被观察对象需要实现attach、detach和notify三个方法来管理观察者的注册、注销和通知。而观察者则需实现update方法来接收被观察对象的状态变化通知。

以下是SplSubject和SplObserver接口的详细方法定义:

SplSubject

abstract public function attach(SplObserver $observer);
abstract public function detach(SplObserver $observer);
abstract public function notify();

SplObserver

abstract public function update(SplSubject $subject);

通过这些接口,开发者可以轻松地将各种模块连接起来。例如,在用户注册时,User类作为被观察对象,负责通知其关注的模块(如UserDatabase和UserMail)进行相应操作。

用户注册示例:

function _main() {
$user = new User('zhibin', 'zhibin');
$user->attach(new UserDatabase());
$user->attach(new UserMail());
$user->notify();
}

类定义:

class User implements SplSubject {
private $_userName;
private $_password;
private $_observers = array();
public function __construct($user_name, $password) {
$this->_userName = $user_name;
$this->_password = $password;
$this->_observers = array();
}
public function attach(SplObserver $obs) {
array_push($this->_observers, $obs);
}
public function detach(SplObserver $obs) {
$key = array_search($obs, $this->_observers, true);
if ($key !== false) {
unset($this->_observers[$key]);
}
}
public function notify() {
foreach ($this->_observers as $obs) {
$obs->update($this);
}
}
}
class UserDatabase implements SplObserver {
public function update(SplSubject $sub) {
echo 'update database' . PHP_EOL;
}
}
class UserMail implements SplObserver {
public function update(SplSubject $sub) {
echo 'send mail to user' . PHP_EOL;
}
}

通过以上代码,可以看出User类作为被观察对象在注册时会通知所有注册的观察者(UserDatabase和UserMail),从而实现数据保存和邮件发送的自动化流程。

转载地址:http://nltfk.baihongyu.com/

你可能感兴趣的文章