2013-06-05 81 views
5

我有观察者模式的问题。它说Observer和Subject应该都是接口。我明白为什么观察者是接口,但为什么将这个主题设为抽象类是不是更好?你不能已经实施至少删除/注册?观察者模式抽象与接口

回答

8

设计模式旨在适应应用程序的特定需求;他们并没有制定规则。特别是要确定某个抽象类或接口是否属于某个抽象类或接口,并考虑该决定对其他应用程序的所有影响。

也就是说,出于多种原因,接口被推荐超过抽象类。例如,抽象类需要使用继承,并且在许多语言中,您不能从多个类继承。如果这对您的用例不是问题,请继续使用抽象类,如果您发现它们更方便。

+0

在许多方面,理想的模式是有其实现的接口一个抽象类,但从来没有定义抽象的任何存储位置类类型 - 始终使用该接口。这将允许可以从抽象类型派生的类简单地继承有用的代码,而那些必须从其他类型派生的类可以将任何通用代码作为样板文件导入。但是,如果某些类型的使用者使用抽象类型而不是接口类型,那么这种方法就会失败,尽管除非类需要访问其他实例的私有数据,否则这种方法不是必需的。 – supercat

5

为什么不只有一个实现Subject的抽象类?使用界面只是给你更大的灵活性。从抽象类开始,它并不真正为你购买任何东西。如果每一件事情都发生了很大的变化(比如跨越进程边界),那么你的Observable将会停留在抽象实现上。

+0

好感谢ü所有球员的帮助很大:) – Maximosaic

1

为什么没有更好的有主题的抽象类

为了避免追平了设计一个特定的具体实施。记住目的是创建一个模式,使您能够灵活地根据需要交换具体主题,并且不会将观察者与任何原始实现相关联。

您不希望观察者引用FirstConcreteSubject,而是引用ISubject,它可以快速更改为由SecondConcreteSubject实现而无需修改观察者。

也就是说,没有什么不对(IMHP)有一个抽象类来存储一些本来被FirstConcreteSubjectSecondConcreteSubject重复的代码。

2

在使用word界面的设计模式中,它意味着暴露给客户端组件的抽象API将具有不同的具体实现。

当设计模式接口映射到Java世界时,它可能是Java接口或Java抽象类,而设计模式具体类映射到Java常规类(非抽象)。

但是,在作出决定时,您需要了解Java界面和抽象类之间的差异及其用途以及优缺点。

参见:Interface Vs Abstract Class