以观察者模式发布初始状态

Gro*_*uez 5 design-patterns observer-pattern

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

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有更好/首选的方法吗?

jan*_*jan 1

我不知道它是否可以被认为是首选,但是在反应性扩展
的“热可观察量” 的上下文中,使用了成语“ 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

     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
Run Code Online (Sandbox Code Playgroud)