Observer pattern 观察者模式遵循/违反了哪些坚实的原则?

Observer pattern 观察者模式遵循/违反了哪些坚实的原则?,observer-pattern,software-design,solid-principles,Observer Pattern,Software Design,Solid Principles,我正在准备考试,目前正在阅读关于观察者模式的文章。然后我想知道观察者模式遵循或违反了哪些坚实的原则?我自己的想法: 我认为它遵循OCP,因为将来您可以使用新的观察者来扩展代码,而不是修改现有代码以使这些新的观察者适应。 它也遵循ISP,因为主体和观察者界面对于观察者/主体要做的特定工作来说是精确和小的 当我试图使其余的原则与观察者模式相适应时,这变得有点牵强。也许ISP也是这样?你的想法是什么? 软件设计模式不一定使用所有的原则,是吗?设计模式——顾名思义——只是模式。在不同的应用程序中,它们的

我正在准备考试,目前正在阅读关于观察者模式的文章。然后我想知道观察者模式遵循或违反了哪些坚实的原则?

我自己的想法:

我认为它遵循OCP,因为将来您可以使用新的观察者来扩展代码,而不是修改现有代码以使这些新的观察者适应。 它也遵循ISP,因为主体和观察者界面对于观察者/主体要做的特定工作来说是精确和小的

当我试图使其余的原则与观察者模式相适应时,这变得有点牵强。也许ISP也是这样?你的想法是什么?
软件设计模式不一定使用所有的原则,是吗?

设计模式——顾名思义——只是模式。在不同的应用程序中,它们的实际实现可能会有很大差异

一般来说,与观察者相关的最可靠的原则是打开/关闭原则:一旦您编写了观察对象的代码,当您希望其他观察者知道它时,您不需要更改代码,但是添加这样的观察者很容易——这正是“关闭以进行修改,打开以进行扩展”的意思

它也可以被视为依赖倒置原则的应用:被观察的主体强制执行一个已知的API,在该API中,任何想要观察它的人都必须遵循一些规则,特别是,被观察的主体将调用其
update()
函数,而不是调用观察者的特定函数。这样,如果要更改观察器,则观察到的类没有什么可做的(将其与调用特定观察器函数的选项进行比较)

在基本的、经典的实现(即GoF的实现)中,可能存在违反SRP和ISP的情况

在该实现中,正在更改的对象负责更新观察者。这是该类除主要职责外的另一项职责。因此,将来更新类的“原因”不止一个——如果必须更改更新机制(例如,使用不同的容器、使用线程安全机制等)——更改将发生在具有完全不同的主要职责的同一类上。当然,这可以通过将“观察者”机制分离到另一个类来解决

简单化实现的另一个可能的实质违反是,根据GoF的实现,每个更新的观察者应该检查被观察对象的状态,以检测变化。这可能意味着没有界面隔离,因为任何观察者都应该接触到被观察对象中的一切。但是,它不必以这种方式工作,而且很容易提供更复杂的实现,这些实现使用不同的接口来连接不同的观察者


该模式与Liskov替换原则没有多大关系-只要继承(例如,通过具体类型继承观察者和观察到的类型)没有做不应该做的事情,那么该原则将被保留。

为什么不尝试一下并告诉我们您的想法?