类的自动载兼观察者模式的设计

  • 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\n";
        $this->notify();
    }
}
class Test1 implements Observer
{
  public function update(){
      echo "我是Test事件1\n";
  }
}
class Test2 implements Observer
{
    public function update(){
        echo "我是Test事件2\n";
    }
}
class Test3 implements Observer
{
    public function update(){
        echo "我是Test事件3\n";
    }
}
class Test4 implements Observer
{
    public function update(){
        echo "我是Test事件4\n";
    }
}
$event = New Genertor();
$event->addObserve(new Test1);
$event->addObserve(new Test2);
$event->addObserve(new Test3);
$event->addObserve(new Test4);
$event->trigger();
?>

测试结果

posted @ 2019-02-11 17:49  阿鸠  阅读(166)  评论(0编辑  收藏  举报