本文共 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/