为什么字段observers
和方法Attach
,Detach
和Notify
位于界面Subject
中,而方法GetState
和{ {1}}和字段SetState
位于具体子类SubjectState
中?为什么成员分布在主题接口和具体子类中呢?
为什么方法ConcreteSubject
位于接口Update
中,而字段Observer
和subject
位于具体子类observerState
中?
为什么成员分布在观察者接口和具体子类中呢?
主体和观察者之间似乎没有对称性。
例如,为什么字段ConcreteObserver
属于接口observers
,而字段Subject
属于subject
?
感谢。
答案 0 :(得分:1)
Subject接口中的GetState和SetState方法将使Subject接口依赖于依赖对象的更新方式。这违反了依赖性倒置原则。
所有主题界面都附加一个具体主题并通知观察者。具体对象的状态如何改变它与此无关。这就是getState和setState不属于Subject Interface的原因。
为什么observeState不是Observer接口的一部分。
答案 1 :(得分:1)
这是观察者设计模式。所有GOF模式都将最大程度地使用OO原则。如果职责(和状态)在许多子类中很常见,那么需要在基类层次结构中将其升级到最可能的层。以下演示代码和注释将回答上述问题。 确实有些设计模式(和Observer就是其中之一。参见update()中的类型转换)违反了OO原则。 完全可以违反这些原则只需要知道哪个原则以及我们违反 的原因。并检查 - 我们是否比实施中引入的可能的不灵活性/损害获得更多好处?
mtcars