打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
php设计模式

1、什么是观察者模式?

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了

从面向对象的角度来看,主题提供注册和通知的接口,观察者提供自身操作的接口。(这些观察者拥有一个同一个接口。)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。耦合度相当之低

流程图如下:

2、为什么要用观察者模式?

观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情。不利用主题类的话,我们还需要不断循环创建实例,执行操作。而现在只需要创建实例就好,执行操作的事儿只需要调用一次通知的方法就好啦

3、应用场景

当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式

4、示例代码

/** * @purpose: 观察者接口, 定义观察者具体需要执行的方法,当然方法名和方法个数可以自定义 * Interface Observer */interface Observer{    /**     * @purpose: 广播通知后,所有已注册的观察者都需要执行该方法。     * @return mixed     */    public function eat();}/** * @purpse: 定义猫猫类,继承观察者接口,实现具体细节 * Class Cat */class Cat implements Observer{    public function eat(){        echo 'Cat eat fish';    }}/** * @purpse: 定义狗狗类,继承观察者接口,实现具体细节 * Class Dog */class Dog implements Observer{    public function eat(){        echo 'Dog eat bones';    }}/** * @purpose: 主题接口, 定义添加观察者和广播通知的方法 * Interface Notify */interface Subject{    /**     * @purpose: 添加观察者     * @param string $key 给所添加的观察者的一个唯一 key,方便从注册树中移除观察者     * @param Observer $observer 观察者对象     * @return mixed     */    public function addObserver($key, Observer $observer);    /**     * @purpose: 从注册树中移除观察者     * @param string $key 给所添加的观察者的一个唯一 key,方便从注册树中移除观察者     * @return mixed     */    public function removeObserver($key);    /**     * @purpose: 广播通知以注册的观察者     * @return mixed     */    public function notify();}/** * @purpose: 实现主体接口,主要就是添加观察者和广播通知观察者 * Class Action */class Action implements Subject{    /**     * @var array 保存所有已注册的观察者     */    public $_observer = [];    /**     * @purpose: 添加观察者     * @param string $key 给所添加的观察者的一个唯一 key,方便从注册树中移除观察者     * @param Observer $observer 观察者对象     * @return mixed     */    public function addObserver($key, Observer $observer)    {        $this->_observer[$key] = $observer;    }    /**     * @purpose: 从注册树中移除观察者     * @param string $key 给所添加的观察者的一个唯一 key,方便从注册树中移除观察者     * @return mixed     */    public function removeObserver($key)    {        unset($this->_observer[$key]);    }    /**     * @purpose: 广播通知以注册的观察者,对注册树进行遍历,让每个对象实现其接口提供的操作     * @return mixed     */    public function notify()    {        foreach ($this->_observer as $observer) {            $observer->eat();        }    }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
设计模式-观察者模式
PHP设计模式之观察者模式
PHP设计模式—观察者模式
观察者模式Lua实现
观察者模式
《JAVA与模式》之观察者模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服