6 三月, 2005

plog学习 - Observer Pattern

plog所有的Action对象都是从Observable基类继承过来,但是却没有一个实现了的Observer对象,可见,这部分是plog想用却没有在0.32版中付诸行动,为将来扩展做准备的。
我去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。流程如下:
  1. AddCommentAction对象创建,初始化$observers成员变量
  2. SendNotificationEmail(& $AddCommentAction)对象创建,调用$AddCommentAction->addObserver,将自己注册到AddCommentAction对象的$observers队列中去
  3. AddCommentAction执行增加评论的函数
  4. 调用setState("add-comment")
  5. 然后调用notifyObservers过程,向$observers队列中所有observers发送执行update操作的命令
  6. SendNotificationEmail的update过程执行,根据$AddCommentAction->getState()的值,进行进一步行动
  7. SendNoficationEmail进入发送通知邮件过程
概括起来,也就是Observer向Observable注册,Observable通知所有注册的Observer对象执行update操作

如果我们想在收到评论通知的同时,收到短信通知,我们不需要修改AddCommentAction对象,而只需要增加一个新的Observer: SendNotificationSMS即可,扩展性就体现在这儿。

需要指出的是,Observable在它的notifyObservers过程中依次调用observers的update,属并发操作,当observer数量增多并且update操作复杂时,有可能会严重影响obserable的效率。

源码可以参考plog中自带的Obserable.class.php, Obsever.class.php。


最新回复
发表评论


















Bold Italic Link