【问题标题】:Update method of Observer Design Pattern观察者设计模式的更新方法
【发布时间】:2012-08-23 01:03:19
【问题描述】:

我见过一些观察者模式的例子。

为什么 Observer 接口中的 update 方法在某些情况下会包含对被观察对象的引用? 观察者不知道它在观察什么物体吗?

请举例说明。

【问题讨论】:

  • 我同意这并不常见。特别是因为观察者的 update() 方法通常由可观察对象在必须通知其状态更改时调用。能否贴出让你怀疑的例子?

标签: c# java design-patterns


【解决方案1】:

它可能有也可能没有对主题的引用,具体取决于具体问题。

Subject 可能只调用 update() 函数并在 Observer 中设置一些值,因此 Observer 不需要引用。或者它可以通知 Observer 发生了变化,Observer 将通过它拥有的引用联系 Subject 并获取新的值。

如果观察者需要通知主题一些事情,也可以在实现中使用引用。

【讨论】:

    【解决方案2】:

    具体到您的最后一个问题,鉴于 C# 和 Java 作为编程语言,一个对象如何“知道”另一个对象,除了通过引用?

    观察者和主体之间的关系需要存储在某个地方,而在 Java 和 C# 中,如果需要对主体或观察者调用任何操作,则只能通过引用来存储。

    【讨论】:

    • 好点。有时,编程语言的语法和语义可能会改变设计模式的实现方式。
    【解决方案3】:

    你好 Amandeep,你可以阅读这篇文章,非常有趣,你拥有 GOF 的所有设计模式

    你有类图,示例代码

    它解释了关于观察的所有概念:Subject, ConcreteSubject, Observer 和 ConcreteObserver

    http://www.dofactory.com/Patterns/PatternObserver.aspx

    【讨论】:

      【解决方案4】:

      一个Observer 可以观察到许多Observable,因此当他收到通知时,它可以以特定方式处理更改。例如:

      import java.util.Observable;
      import java.util.Observer;
      
      public class ObserverSample {
          static class ObservableExtension extends Observable {
              void doSomething() {
                  setChanged();
                  notifyObservers();
                  clearChanged();
              }
          }
      
          public static void main(final String[] args) {
              final ObservableExtension observable1 = new ObservableExtension();
              final Observable observable2 = new ObservableExtension();
              final Observer observer = new Observer() {
                  @Override
                  public void update(final Observable o, final Object arg) {
                      if (o == observable1)
                          System.out.println("This is the first observable");
                      else if (o == observable1)
                          System.out.println("This is the second observable");
                      else
                          System.out.println("This is another observable");
                  }
              };
              observable1.addObserver(observer);
              observable2.addObserver(observer);
              observable1.doSomething();
          }
      }
      

      但是,我不喜欢这种方法( 唯一的优点是内存占用更小。),我更喜欢有不同的 Observer 具有单一的责任。

          observable1.addObserver(new Observer() {
              @Override
              public void update(Observable o, Object arg) {
                  System.out.println("This is the first observable");
              }
          });
          observable2.addObserver(new Observer() {
              @Override
              public void update(Observable o, Object arg) {
                  System.out.println("This is the second observable");
              }
          });
      

      【讨论】:

        【解决方案5】:

        快速简答

        观察者模式可以有多种变体。

        其中一个只允许检测被观察对象的变化,并可能显示它们的属性值。其他也允许执行操作。

        【讨论】:

          猜你喜欢
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 2021-07-09
          • 2011-09-25
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          相关资源
          最近更新 更多