zoukankan      html  css  js  c++  java
  • 类的自动载兼观察者模式的设计

    • spl_autoload_register函数的调用autoload引入文件。
    • 观察者设计模式:当对象的属性发生改变的时候,依赖他的对象会接收到通知,并且更新相应的属性。
    • 场景:当一个事件的发生,有一大连串的逻辑要改动,传统的编程方式用if else 等冗余复杂的去修改,这种方式高度耦合的,入侵式更新机制,当逻辑修改得越多的时候代码是很难维护的。
    • 观察者模式:实现低耦合,非入侵式的更新机制。

    为了方便理解,这是我的目录结构

    自动加载类文件的代码

    <?php
    /*
     * 1.实现类的自动加载
     * 2.设计模式 之 观察者模式
     */
    define ('BASEDIR',__DIR__);
    require "Loader.php";
    //自动载入类文件
    spl_autoload_register('Loader::autoload');
    <?php
    class  Loader{
    
        static function autoload($class)
        {
            //引入相应的文件
            require BASEDIR.'/'.str_replace('\', '/', $class).'.php';
        }
    }

    观察者的生产代码

    <?php
    abstract class Event
    {
        //观察事件一般不可见
        private $observer = array();
    
        public function addObserve(Observer $observer){
                //将观察者添加到数组
                $this->observer[] = $observer;
        }
        public function notify()
        {
            //遍历更新输出
            foreach ($this->observer as $value) {
                $value->update();
            }
        }
    }

    更新的契约接口

    <?php
    interface Observer{
       //契约接口的声明
        public function update();
    
    }

    主体观察者模式测试代码(也是入口文件)

    <?php
    /*
     * 1.实现类的自动加载
     * 2.设计模式 之 观察者模式
     */
    define ('BASEDIR',__DIR__);
    require "Loader.php";
    //自动载入类文件
    spl_autoload_register('Loader::autoload');
    
    class Genertor extends Event
    {
        public  function  trigger(){
            echo "逻辑·1
    ";
            $this->notify();
        }
    }
    class Test1 implements Observer
    {
      public function update(){
          echo "我是Test事件1
    ";
      }
    }
    class Test2 implements Observer
    {
        public function update(){
            echo "我是Test事件2
    ";
        }
    }
    class Test3 implements Observer
    {
        public function update(){
            echo "我是Test事件3
    ";
        }
    }
    class Test4 implements Observer
    {
        public function update(){
            echo "我是Test事件4
    ";
        }
    }
    $event = New Genertor();
    $event->addObserve(new Test1);
    $event->addObserve(new Test2);
    $event->addObserve(new Test3);
    $event->addObserve(new Test4);
    $event->trigger();
    ?>

    测试结果

  • 相关阅读:
    Vue 单向数据流&双向数据绑定原理
    Arguments对象
    类数组对象(array-like objects)
    ...theArgs剩余参数
    vue 深度选择器/deep/报错(标红)
    修改mandMobile下拉菜单样式
    PC端input maxlength 失效问题
    el-input 正则限制输入为非负整数
    Mac鼠标左右键都是右键
    Vue双向数据绑定简易实现
  • 原文地址:https://www.cnblogs.com/zhengweizhao/p/10362700.html
Copyright © 2011-2022 走看看