是否有一个首选的习惯用法,用于在观察者模式中向新观察者发布“初始状态”?
描述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);
}
}
有更好的/首选方法吗?
答案 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