观察者设计模式的主题是接口还是超class?
Subject of Observer design pattern an interface or a super class?
我正在学习 coursera 课程中的设计模式。他们有课程笔记,其中他们将观察者设计模式的 Subject
定义为超级 class,如下图和代码所示
UML
代码(主题)
现在我认为 Subject
class 本身是无用的,直到子class 从它继承并创建任何特定主题。在那种情况下, Subject
不应该是 java interface
吗?为什么 Subject
不是 java 接口而 Observer
是
有什么具体原因吗。我对此有点困惑。
谢谢
观察者D P很简单。
Subject 是 Observer 观察的实体。
Subject是单一实体,Observers可以是多个。
Subject 有List observers,但是Observer 会有Subject。
Subject的任何变化都会通知所有观察者,Subject以列表的形式存储。
我们也可以将 Subject 作为接口。一切都取决于我们实现上述几点的方式。
如果 Subject
是一个接口,那么每个实现 Subject
的 class 都必须重新实现所有 registerObserver
、unregisterObserver
和 notify
非常标准的方法。
你可能会说你会把这些方法放到一个助手 class 中,这样每个派生的 Subject
都可以将任务委托给这个助手。但毕竟,您必须为所有派生的 Subject
class 复制委托代码。尽管委托代码简短明了,但重复仍然令人沮丧。
您可以在 Bob 叔叔这篇非常有趣的文章的末尾找到该论点:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html
我正在学习 coursera 课程中的设计模式。他们有课程笔记,其中他们将观察者设计模式的 Subject
定义为超级 class,如下图和代码所示
UML
代码(主题)
现在我认为 Subject
class 本身是无用的,直到子class 从它继承并创建任何特定主题。在那种情况下, Subject
不应该是 java interface
吗?为什么 Subject
不是 java 接口而 Observer
是
有什么具体原因吗。我对此有点困惑。
谢谢
观察者D P很简单。
Subject 是 Observer 观察的实体。
Subject是单一实体,Observers可以是多个。
Subject 有List observers,但是Observer 会有Subject。
Subject的任何变化都会通知所有观察者,Subject以列表的形式存储。
我们也可以将 Subject 作为接口。一切都取决于我们实现上述几点的方式。
如果 Subject
是一个接口,那么每个实现 Subject
的 class 都必须重新实现所有 registerObserver
、unregisterObserver
和 notify
非常标准的方法。
你可能会说你会把这些方法放到一个助手 class 中,这样每个派生的 Subject
都可以将任务委托给这个助手。但毕竟,您必须为所有派生的 Subject
class 复制委托代码。尽管委托代码简短明了,但重复仍然令人沮丧。
您可以在 Bob 叔叔这篇非常有趣的文章的末尾找到该论点:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html