|
来源:http://trac.seagullproject.org/wiki/Howto/PragmaticPatterns/Observers Setting up Subject / Observer Relationships概述通过程序序中的一个输入会激发某个特定的事件,但是随着商业处理逻辑的进行,触发的事件也随之增长。observer模式是一个将响应对应到事件的理想的方法。以用户注册为例,我们将调用‘注册事件’。 用户注册以获得验证,调用这个事件需要下列响应:
处理这些响应很快会将你的代码变得混乱。此外,响应最好是模块化的,这样它们就以在一系列的事件中重用。开始使用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’中。 |