浅谈设计模式之观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式。


应用场景:当我们在亚马逊下一个订单,这时候我们的邮箱会收到一封邮件,商家的邮箱也有收到一封邮件,我们的代码会如下:


class Order{
    public function register(){
        //TO-DO 下订单
        echo "下订单完成";
        //订单完成之后操作
        echo "给用户发邮件";
        echo "给商户发邮件";
        //TO-DO 其他事
    }
}

当我们的业务慢慢的变复杂。可能里面会有许多许多逻辑代码,然而每一次增加功能,都需对原来代码进行修改,并且每一个功能点之间耦合度太高。
用观察者模式重构我们之前的代码:

  1. 编写事件基类(主要2个方法:增加观察者方法;事件通知方法)

    
    //事件产生者
    abstract  class EventGenerator{
        //保存观察者数组(子类无需知道观察者因此是private)
        private $observers = [];
    
        //增加观察者
        function addObserver(Observer $observer){
            $this->observers[] = $observer;
        }
    
        //事件通知
        function notiy(){
            foreach ($this->observers as $item){
                $item->update();
            }
        }
    }
    
  2. 编写观察者接口
    
    interface Observer{
        //逻辑代码实现
        function update($evect_info = null);
    }
    
  3. 实现观察者逻辑接口
    
    //逻辑1
    class Observer1 implements \Lib\Observer{
        function update($evect_info = null) {
            echo "给用户发邮件";
        }
    }
    //逻辑2
    class Observer2 implements \Lib\Observer{
        function update($evect_info = null){
            echo "给商户发邮件";
        }
    }
    
  4. 在主方法中调用
    
    class Order extends \Lib\EventGenerator {
        function trigger(){
            echo "下单成功";
            //调用该事件的通知观察者方法
            $this->notiy();
        }
    }
    $event = new Event();
    //随意增加(删除)观察者
    $event->addObserver(new \Lib\Observer1());
    $event->addObserver(new \Lib\Observer2());
    $event->trigger();
    

    总结:这样就实现了各个逻辑代码之间的解耦。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!