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

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 又称为发布-订阅(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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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