【问题标题】:Subject of Observer design pattern an interface or a super class?观察者设计模式的主题是接口还是超类?
【发布时间】:2018-11-10 13:53:06
【问题描述】:

我正在 coursera 的一门课程中学习设计模式。他们有课程笔记,其中他们将观察者设计模式的Subject 定义为超类,如下图和代码所示

UML

代码(主题)

现在我认为Subject 类本身是无用的,除非子类从它继承并创建任何特定主题。在那种情况下,Subject 不应该是 java interface 吗? Subject不是java接口但Observer是java接口是什么原因。

是否有任何具体原因。我对此有点困惑。

谢谢

【问题讨论】:

  • 我认为 Subject 类本身是无用的,除非子类从它继承并创建任何特定的主题- 为什么会这样?
  • @user7 因为除了附加和分离观察者并保留它们的列表之外它还在做什么,当我们将从主题继承时,它最终将出现在子类中,换句话说,现在子类在继承后具有相同的代码加上自己的附加代码,所以如果主题是接口并且类实现了该功能,那不是一样吗?

标签: java oop design-patterns uml


【解决方案1】:

如果Subject 是一个接口,那么每个实现Subject 的类都必须重新实现所有非常标准的registerObserverunregisterObservernotify 方法。

您可能会说您将把这些方法放入一个助手类中,以便每个派生的Subject 都可以将任务委托给这个助手。但毕竟,您必须为所有派生的Subject 类复制委托代码。尽管委托代码简短直接,但这种重复仍然令人沮丧。

你可以在 Bob 叔叔这篇非常有趣的文章的结尾找到这个论点:http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html

【讨论】:

  • 谢谢,这是一篇有趣又有趣的文章,回答了很多其他令人沮丧的问题
  • 他的观点究竟是什么被认为是有害的界面?他的意思是界面不好?
  • 因为接口是部分解决或缓解“不支持多继承”问题的变通方法。接口还不错,但是由于它的发明,语言设计者并没有用更正确的方式解决问题,所以我们不需要接口,只要抽象类就可以了,就像C++一样。
【解决方案2】:

Observer D P 很简单。

  1. Subject 是 Observer 监视的实体。

  2. Subject 是单个实体,Observers 可以是多个。

  3. Subject 拥有 List 观察者,但 Observer 将拥有 Subject。

  4. Subject 中的任何更改都会以列表的形式通知给 Subject 存储的所有观察者。

  5. 我们也可以将主题作为接口。一切都取决于我们实现上述几点的方式。

【讨论】:

  • 谢谢,我想你是对的。只要所有要点都成立,实施就可以有所不同。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多