6 三月, 2005
plog学习 - Observer Pattern
我去http://www.phppatterns.com/index.php/article/articleview/27/1/1/上查看了Observer Pattern的实现机制,觉得很受启发。
Observer Pattern并不复杂,它分为Observable对象和Observer对象。它的目的是在不改动应用程序主体的前提下,方便地增加对一个主要动作(Observable对象)的关联动作(Observer对象)的处理。它一般应用在一个对象有很多关联对象,当对这个对象进行操作时,会同时影响到那些关联对象执行相应的操作。与数据库做比较,Observer Pattern就像是数据库中的触发器模式,Observable对象<->表,Observer对象<->Insert、Update、Delete触发器。
以我们UTBlog(plog系统)的评论操作为例具体说明(当然,现在的系统还没真正使用)Observer Pattern。
增加评论的Action就是一个Observable对象: AddCommentAction,在增加评论的同时,系统可能会向订阅评论通知的文章主人发送通知email,这个发送Notification Email的Action就可以当作一个Observer: SendNotificationEmail。流程如下:
- AddCommentAction对象创建,初始化$observers成员变量
- SendNotificationEmail(& $AddCommentAction)对象创建,调用$AddCommentAction->addObserver,将自己注册到AddCommentAction对象的$observers队列中去
- AddCommentAction执行增加评论的函数
- 调用setState("add-comment")
- 然后调用notifyObservers过程,向$observers队列中所有observers发送执行update操作的命令
- SendNotificationEmail的update过程执行,根据$AddCommentAction->getState()的值,进行进一步行动
- SendNoficationEmail进入发送通知邮件过程
如果我们想在收到评论通知的同时,收到短信通知,我们不需要修改AddCommentAction对象,而只需要增加一个新的Observer: SendNotificationSMS即可,扩展性就体现在这儿。
需要指出的是,Observable在它的notifyObservers过程中依次调用observers的update,属并发操作,当observer数量增多并且update操作复杂时,有可能会严重影响obserable的效率。
源码可以参考plog中自带的Obserable.class.php, Obsever.class.php。
最新回复
发表评论



