5

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

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

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

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);
    }
}

有更好/首选的方法吗?

4

2 回答 2

1

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

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

于 2012-10-22T10:37:15.723 回答
1

我不知道它是否可以被认为是首选
但在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
于 2015-01-30T13:16:57.153 回答