类的自动载兼观察者模式的设计
-
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(); ?>
测试结果