中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。
清单 4. Observer.php
<?php interface IObserver { function onChanged( $sender, $args ); }
interface IObservable { function addObserver( $observer ); }
class UserList implements IObservable { private
更好的构造开发模板 五种PHP设计模式 - 凌众科技
快速业务通道
更好的构造开发模板 五种PHP设计模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-25
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
observers = array();
public function addCustomer( $name ) { foreach( $this->_observers as $obs ) $obs->onChanged( $this, $name ); }
public function addObserver( $observer ) { $this->_observers []= $observer; } }
class UserListLogger implements IObserver { public function onChanged( $sender, $args ) { echo( "''$args'' added to user list\n" ); } }
$ul = new UserList(); $ul->addObserver( new UserListLogger() ); $ul->addCustomer( "Jack" ); ?> | 此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。图 4 的 UML 中展示了这些元素。
图 4. 可观察的用户列表和用户列表事件日志程序 | 如果在命令行中运行它,您将看到以下输出:
% php observer.php ''Jack'' added to user list % | 测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者,并将这一更改通知 UserListLogger。
认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。
此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。
命令链模式
命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。清单 5 显示了此模式的一个示例。
清单 5. Chain.php
<?php interface ICommand { function onCommand( $name, $args ); }
class CommandChain { private
更好的构造开发模板 五种PHP设计模式 - 凌众科技
快速业务通道
更好的构造开发模板 五种PHP设计模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-25
|
content |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|
commands = array();
public function addCommand( $cmd ) { $this->_commands []= $cmd; }
public function runCommand( $name, $args ) { foreach( $this->_commands as $cmd ) { if ( $cmd->onCommand( $name, $args ) ) return; } } }
class UserCommand implements ICommand { public function onCommand( $name, $args ) { if ( $name != ''addUser'' ) return false; echo( "UserCommand handling ''addUser''\n" ); return true; } }
class MailCommand implements ICommand { public function onCommand( $name, $args ) { if ( $name != ''mail'' ) return false; echo( "MailCommand handling ''mail''\n" ); return true; } }
$cc = new CommandChain(); $cc->addCommand( new UserCommand() ); $cc->addCommand( new MailCommand() ); $cc->runCommand( ''addUser'', null ); $cc->runCommand( ''mail'', null ); ?> | 此代码定义维护 ICommand 对象列表的 CommandChain 类。两个类都可以实现 ICommand 接口 —— 一个对邮件的请求作出响应,另一个对添加用户作出 |