【问题标题】:Usage of Observer pattern : update() method观察者模式的用法:update() 方法
【发布时间】:2011-06-26 21:25:26
【问题描述】:

嗨,我们(我的一个朋友)有不同的来源(wikis 内容、论坛 cmets、文档上传、RSS 来源......),我们希望在未来的系统中以不同的方式通知它们:Javascript LIVE PUSH (APE),邮件、短信、电话、RSS...

我们为我们的实现考虑了 GoF 观察者设计模式。 观察者设计模式是实现这一目标的好方法吗?

我们考虑使用 Observer 编写代码来格式化要通知的消息(参见示例 1),但也许我们应该向 Observable 返回一个状态以创建消息(参见示例 2)。 就模式而言,这是一个好习惯吗?

如果是,update() 的“真正作用”是什么(默认观察者设计模式方法)?我们真的不明白。

我们在网上找到了这个例子(用于 update() 实现)

1) http://gbenoit79.blogspot.com/2011/04/design-pattern-observer.html

<?php
(...) 
class ConcreteObserverA implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo 'ConcreteObserverA received: ' . $subject->getVariable() . "\n";
    }
}
(...)

2) http://www.minte9.com/kb/php-observer-pattern-example-php-programming-advanced-i1365

<?php
(...)
  class DriverObserver implements Observer{
    public function update(Observable $subject) {
      if ($subject->driven_hours >= 8) {
        $subject->need_sleep = 1;
      } else {
        $subject->need_sleep = 0;
      }
    }
  }
(...)

它们都有效吗?

【问题讨论】:

    标签: design-patterns observer-pattern


    【解决方案1】:

    如果没有更多细节,很难说观察者模式是否是一个好的解决方案,但它可能是一个有效的解决方案。 观察者是观察其他对象的对象,称为主体。当某个主题发生变化时,它会通知其观察者有关其状态的更新。 以你的例子: 您的主题是 wiki 内容、论坛 cmets、文档上传、RSS 源……而您的观察者是 Javascript LIVE PUSH (APE)、邮件、SMS、电话、RSS…… 您应该为应该包含观察者对象集合的主题编写一个抽象类,将方法添加到该集合中,从中删除以及一些方法来选择通知哪些观察者。 Observable 的具体实现将使用一些消息数据作为参数对选定的观察者调用更新。比您需要一个 Observer 接口,该接口将具有在主题更新时调用的 update 方法。具体的实现将比在该更新方法中发送电子邮件、推送到网络或注销自己,等等。 编码完成后,您可以通过创建观察者来初始化通信,而不是创建主题并将观察者添加到主题中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2017-11-13
      • 2011-09-20
      相关资源
      最近更新 更多