zoukankan      html  css  js  c++  java
  • PHP 设计模式 笔记与总结(11)观察者模式

    【观察者模式(Observer)】当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新

    【场景】一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主题的代码

    【观察者模式实现了低耦合,非侵入式的通知与更新机制】

    【实例】

    ① 传统方式:

    index.php

    <?php
    
    class Event{
        function trigger(){
            echo 'Event happened<br />';
            
            //相关的更新操作,传统的方式是在事件代码之后,高耦合,侵入式
            echo '逻辑1更新操作<br />';
            echo '逻辑2更新操作<br />';
        }
    }
    
    $event = new Event();
    $event->trigger();

    ② 观察者模式

    Common 下新建 EventGenerator.php

    <?php
    namespace Common;
    
    //定义一个抽象类
    abstract class EventGenerator{
        private $observer = array();
            function addObserver(Observer $observer){
                $this->observer[] = $observer;
            }
        //通知
        function notify(){
            foreach($this->observer as $observer){
                $observer->update();
            }
        }
    }

    Common 下新建 Observer.php

    <?php
    namespace Common;
    
    //接口
    interface Observer{
        function update($event_info = null);
    }

    入口文件 index.php

    <?php
    define('BASEDIR',__DIR__); //定义根目录常量
    include BASEDIR.'/Common/Loader.php';
    spl_autoload_register('\Common\Loader::autoload');
    echo '<meta http-equiv="content-type" content="text/html;charset=utf8">';
    
    class Event extends CommonEventGenerator{
        function trigger(){
            echo 'Event happened<br />';
            $this->notify();
        }
    }
    
    //编写观察者
    //观察者1
    class Observer1 implements CommonObserver{
        function update($server_info = null){
            echo "逻辑1更新操作<br />
    ";
        }
    }
    //观察者2
    class Observer2 implements CommonObserver{
        function update($server_info = null){
            echo "逻辑2更新操作<br />
    ";
        }
    }
    
    $event = new Event();
    $event->addObserver(new Observer1);
    $event->addObserver(new Observer2);
    $event->trigger();

    输出:

    Event happened
    逻辑1更新操作
    逻辑2更新操作

    当事件发生之后,两个 Observer 的 update 会自动更新,都会被触发。

    没有在事件主体中编写任何的耦合的逻辑1 或者 逻辑2。

    而且可以动态的关闭某一观察者的逻辑(例如注释 $event->addObserver(new Observer1);)

    【附】

    echo "逻辑1更新操作<br />
    ";

    双引号时 不会显示在输出结果中,页面换行通过<br />,查看源码换行通过

    如果换成单引号,则在页面中也会把 和 n 显示出来,而且查看源码也不会换行。

    所以要使用双引号把 包起来。 

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/dee0912/p/4506979.html
Copyright © 2011-2022 走看看