2011-06-29 196 views
5

我已阅读的有关观察者设计模式的参考文献(GOF Design Patterns,Head First Design Patterns,http://www.dofactory.com/Patterns/PatternObserver.aspx)规定具体主题可以引用具体观察者。就像这样:观察者设计模式 - 具体主题和观察者

class ConcreteObserver : IObserver 
{ 
    ConcreteSubject concreteSubjectInstance; 
    //other code, etc. 
} 

现在,如果具体的研究对象是本身实现了主体界面(或者从一些抽象的学科类派生的)为什么不把在ConcreteObserver类型是抽象/接口?即

class ConcreteObserver : IObserver 
{ 
    ISubject concreteSubjectInstance; 
    //other code, etc. 
} 

此外,为什么不把它作为(例如)IObserver接口的领域?

最终,鉴于模式本身似乎放松了主体与其观察者之间的耦合,为什么在将观察者耦合到其主题时,这似乎不被促进?

enter image description here

是这样吗?我只是基于我读过的例子。

+0

请提供您的参考文献 – Nix

+0

@Nix:完成。我觉得这是足够的,因为他们是众所周知的名称没有联系的名称。 –

+0

您发布DOFactory的示例之一显示了抽象类的使用情况? – Nix

回答

6

从你的照片,你的“更新()” 没有收到关于主题的状态的任何信息,因此,如果观察者大概需要这个状态信息(像往常一样在观察者模式),然后方法它必须从调用到“GetState()”方法(不在ISubject中)的ConcreteSubject中检索它。

该模式的替代方法是将状态(或对整个ConcreteSubject的引用)作为“update()”方法的参数传递。

其他一般性解释,不必ConcreteSubject而不是ISubject参考可以是您可能要与ConcreteSubject交互调用业务逻辑(当然不是在ISubject界面曝光)。

+0

'作为参数传递给更新方法':我猜它也可以作为观察者构造函数的参数。 –

+0

是的,要设置内部引用,它应该在构造函数中完成。但是如果你不维护一个内部引用,你仍然可以在每个“update()”调用中接收。这是Java内置观察者模式实现工作的方式。 – edutesoy

2

仅仅因为您读取的状态为subject holds a reference to the concrete observer的定义并不意味着您必须从字面上阅读它。

只要主体具有对观察者的引用/链接(无论是具体还是通过接口/类),该语句仍然为真。

在非常常见的IObserver和IObservable两端看到一个接口。我认为你将要发现的问题是,当你做主题摘要时,你将不得不努力寻找如何使你的国家通用。

0

具体观察者,具体主题实现也有状态。当主体的状态变化时,具体的观察者的状态也在更新。但有时候,你可能需要看到你没有的主体状态,为此,你最好参考主题。换句话说,为了看到具体主题的状态。