本次代码符合PHP规范PRS_0,根目录下新建一个Frame的目录(核心目录),建立APP目录(项目目录),统一访问入口文件index.php,建立类文件Loader.php(用于自动加载类)
index.php 公共部分
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
Loader.php
<?php
namespace Frame;
class Loader
{
static function autoload($class)
{
require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}
观察者模式
首先用一段代码解释一下,当一个Event事件发生时,会触发很多表的更新。
- 一般逻辑写法:耦合都太大,难以维护 逻辑1、2、3分别不同的业务模块,需要侵入式的修改。如果以后还有更多的表需要更新,还要继续修改主程序代码。
再比如一个新员工入职,需要缴纳各种材料、领取各种工作用品、安排体检等等、其实这些事情都是没有关系的。
<?php define('BASEDIR',__DIR__); include BASEDIR.'/Frame/Loader.php'; spl_autoload_register('\\Frame\\Loader::autoload'); class Event { public function trigger() { //当事件发生的时候 echo "Event<br />\n"; //update 耦合都太大,难以维护 逻辑1、2、3分别不同的业务模块,需要侵入式的修改。 echo "逻辑1<br />\n"; echo "逻辑2<br />\n"; echo "逻辑3<br />\n"; } } $event = new Event(); $event->trigger();
观察者模式代码实现
新建Observer.php观察者接口约束
<?php namespace Frame; interface Observer { //观察者更新 public function update($event_info = null); }
新建EventGenerator.php类文件
<?php namespace Frame; abstract class EventGenerator { private $observers = []; /** * 添加观察者 * @param Observer $observer */ public function addObserver(Observer $observer) { $this->observers[] = $observer; } /** * 通知每个观察者 */ public function notify() { foreach ($this->observers as $observer) { $observer->update(); } } }
index.php代码实现
<?php define('BASEDIR',__DIR__); include BASEDIR.'/Frame/Loader.php'; spl_autoload_register('\\Frame\\Loader::autoload'); class Event extends \Frame\EventGenerator { public function trigger() { //当事件发生的时候 echo "Event<br />\n"; //update 耦合都太大,难以维护 逻辑1、2、3分别不同的业务模块,需要侵入式的修改。 //echo "逻辑1<br />\n"; //echo "逻辑2<br />\n"; //echo "逻辑3<br />\n"; $this->notify();//通知 } } //观察者1 实现Observer.php接口 class Observer1 implements \Frame\Observer { public function update($event_info = null) { echo "逻辑1<br />\n"; } } //观察者2 实现Observer.php接口 class Observer2 implements \Frame\Observer { public function update($event_info = null) { echo "逻辑2<br />\n"; } } //观察者3 实现Observer.php接口 class Observer3 implements \Frame\Observer { public function update($event_info = null) { echo "逻辑3<br />\n"; } } $event = new Event(); //添加观察者1、2、3 update $event->addObserver(new Observer1); $event->addObserver(new Observer2); $event->addObserver(new Observer3); $event->trigger();
这样的话如果新加入一个逻辑事件或者更新一个事件只需要添加一个观察者、主业务代码不用改动、去掉一个更新、直接动态关闭就行了。
One comment
PHP设计模式观察者模式
1. 观察者模式( Observer) ,当一个对象状态发生改变时,依赖
它的对象全部会收到通知,并自动更新
2.场景: -个事件发生后,要执行一连串更新操作。传统的编程方
式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码
3.观察者模式实现了低耦合 ,非侵入式的通知与更新机制