以Observer模式发布初始状态

时间:2012-09-25 08:07:42

标签: design-patterns observer-pattern

是否有一个首选的习惯用法,用于在观察者模式中向新观察者发布“初始状态”?

描述Observer模式的大多数可用材料和示例都假设观察者有兴趣收到更改通知,但不关心“初始状态”(观察者订阅更改时的当前状态)。 / p>

一种可能性是在订阅时将“初始”(当前)状态推送给新的观察者,例如:

public class MyObservable extends java.util.Observable
{
    public synchronized void addObserver(Observer observer)
    {
        super.addObserver(observer);

        // Push current state to this observer
        observer.update(this, currentState);
    }
}

有更好的/首选方法吗?

2 个答案:

答案 0 :(得分:1)

不是真的。但通常在观察者层次结构的根处有一些配置文件或默认设置,因此在读取/设置这些事件时,将初始化级联事件。

棘手的一点是确保所有设置都已分组,以便可观察的实体按照“合法”的顺序设置,或者至少按照您期望的方式工作。

答案 1 :(得分:0)

我不知道它是否可以被视为首选
但在Reactive Extensions'的背景下" hot observables",成语" Replay"使用:

简短演示(C#):

using System;
using System.Reactive.Linq;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      var observable = Observable.Interval(TimeSpan.FromSeconds(1))
        .Do(l => Console.WriteLine("Publishing {0}", l))  //side effect to show it is running
        .Replay(1);                                       // buffer the last entry

      Console.ReadKey();

      using (observable.Connect())                        // turn it "hot"
      {
        Console.ReadKey();

        observable.Subscribe(i => Console.WriteLine("OnNext #1: {0}", i));

        Console.ReadKey();

        using (observable.Subscribe(i => Console.WriteLine("OnNext #2: {0}", i)))
        {
          Console.ReadKey();
        }                                                 // unsubscribes #2 again

        Console.ReadKey();
      }                                                   // turn it "cold"

      Console.ReadKey();
    }
  }
}

输出:

     Publishing 0
    Publishing 1
    Publishing 2
     OnNext #1: 2
    Publishing 3
    OnNext #1: 3
    Publishing 4
    OnNext #1: 4
    Publishing 5
    OnNext #1: 5
     OnNext #2: 5
    Publishing 6
    OnNext #1: 6
    OnNext #2: 6
    Publishing 7
    OnNext #1: 7
    OnNext #2: 7
    Publishing 8
    OnNext #1: 8
    OnNext #2: 8
     Publishing 9
    OnNext #1: 9
    Publishing 10
    OnNext #1: 10