为什么有些方法属于主题/观察者界面,而有些方法属于主题/观察者具体的子类?

时间:2017-09-30 01:21:49

标签: c++ design-patterns observer-pattern gang-of-four

四人帮的设计模式 enter image description here

为什么字段observers和方法AttachDetachNotify位于界面Subject中,而方法GetState和{ {1}}和字段SetState位于具体子类SubjectState中?为什么成员分布在主题接口和具体子类中呢?

为什么方法ConcreteSubject位于接口Update中,而字段Observersubject位于具体子类observerState中? 为什么成员分布在观察者接口和具体子类中呢?

主体和观察者之间似乎没有对称性。 例如,为什么字段ConcreteObserver属于接口observers,而字段Subject属于subject

感谢。

2 个答案:

答案 0 :(得分:1)

Subject接口中的GetState和SetState方法将使Subject接口依赖于依赖对象的更新方式。这违反了依赖性倒置原则。

所有主题界面都附加一个具体主题并通知观察者。具体对象的状态如何改变它与此无关。这就是getState和setState不属于Subject Interface的原因。

为什么observeState不是Observer接口的一部分。

答案 1 :(得分:1)

这是观察者设计模式。所有GOF模式都将最大程度地使用OO原则。如果职责(和状态)在许多子类中很常见,那么需要在基类层次结构中将其升级到最可能的层。以下演示代码和注释将回答上述问题。 确实有些设计模式(和Observer就是其中之一。参见update()中的类型转换)违反了OO原则。 完全可以违反这些原则只需要知道哪个原则以及我们违反 的原因。并检查 - 我们是否比实施中引入的可能的不灵活性/损害获得更多好处?

mtcars