观察者设计模式 - 具体主题和观察者

Jam*_*man 7 design-patterns observer-pattern

我读过关于观察者设计模式的参考文献(GOF设计模式,头部设计模式,http://www.dofactory.com/Patterns/PatternObserver.aspx)规定了具体主题对具体观察者的参考.很像这样:

class ConcreteObserver : IObserver
{
    ConcreteSubject concreteSubjectInstance;
    //other code, etc.
} 
Run Code Online (Sandbox Code Playgroud)

现在,如果具体的Subject本身实现了一个Subject接口(或派生自一些抽象的Subject类),为什么不让ConcreteObserver中的类型成为那个抽象/接口?即

class ConcreteObserver : IObserver
{
    ISubject concreteSubjectInstance;
    //other code, etc.
} 
Run Code Online (Sandbox Code Playgroud)

而且,为什么不把它作为(例如)IObserver界面中的一个字段呢?

最终,鉴于模式本身似乎放松了主体与其观察者的耦合,为什么在将观察者与其主体耦合时,这似乎不会得到提升?

在此输入图像描述

或者是吗?我只是基于我读过的例子.

Mr.*_*art 6

从您的图片中,您的"update()"方法不会收到有关Subject的状态的任何信息,因此,如果Observer需要有关此状态的信息(通常在观察者模式中),那么它必须从ConcreteSubject中检索它调用"GetState()"方法(不存在于ISubject中).

此模式的替代方法是将状态(或对整个ConcreteSubject的引用)作为"update()"方法的参数传递.

对ConcreteSubject而不是ISubject的引用的其他一般解释可能是您可能希望与ConcreteSubject交互以调用业务逻辑(当然不在ISubject接口中公开).