来源:http://trac.seagullproject.org/wiki/Howto/PragmaticPatterns/Observers

Setting up Subject / Observer Relationships

概述

通过程序序中的一个输入会激发某个特定的事件,但是随着商业处理逻辑的进行,触发的事件也随之增长。observer模式是一个将响应对应到事件的理想的方法。以用户注册为例,我们将调用‘注册事件’。

用户注册以获得验证,调用这个事件需要下列响应:

  • 给用户发送email以确认注册
  • 给管理员发送eamil通知新的注册用户
  • 在临时表中插入一条用户记录
  • 将用户资料更新到合作伙伴网关(posting of user info to marketing partner gateway)
  • increment of stats table
  • 等等

处理这些响应很快会将你的代码变得混乱。此外,响应最好是模块化的,这样它们就以在一系列的事件中重用。开始使用observer模式,下面是一个 Seagull注册的例子。

实践

看RegisterMgr管理类的insert行为,使用了一些步骤来设置该事件的observer。

Subject = the registration event,  User_AddUser, encapsulated in RegisterMgr::_cmd_insert();
Observers = EmailConfirmation, AuthenticateUser, UpdateTracAuth

insert行为必须创建一个subject对象,也称之为observer对象。问题中存在的类:

class User_AddUser extends SGL_Observable {}

User_AddUser类通过继承SGL_Observable类实现了可侦测的行为。在PHP5中用implement关键字更适合。

observer被指定到事件,在这种情况下,observer列表来自于配置文件:

$addUser = new User_AddUser($input, $output);
$aObservers = explode(',', $this->conf['RegisterMgr']['observers']);
foreach ($aObservers as $observer) {
    $path = SGL_MOD_DIR . "/user/classes/observers/$observer.php";
    if (is_file($path)) {
        require_once $path;
        $addUser->attach(new $observer());
    }
}

当所有的observer对应后,简单运行下列过程:

$addUser->run();

一旦事件中的商务逻辑处理被执行,通过下面

$this->notify();

所有设置好的listener将被通知激活事件已经被发出。

惯例

目前所有的oberver保存在的模块中,在类目录下的一个名为‘observers’中。

 
howto/pragmaticpatterns/observers.txt · 最后更改: 2010/05/30 00:21 (外部编辑)
 
Except where otherwise noted, content on this wiki is licensed under the following license:GNU Free Documentation License 1.2