我是设计模式的新手,我正在学习Observer模式,因为我去了很多网站,在那里我找到了下面的UML图
所以我的问题是关于UML或类设计。如果观察者模式的目的是通知观察者主体/对象的状态变化,为什么主题需要是抽象的,它不能是一个ConcreteSubject直接如下图所示:
如果我们将Subject创建为ConcreteSubject,有什么缺点或违规。
答案 0 :(得分:3)
我理解定义抽象主题类的目的是提供观察者订阅和接收通知所需的属性和方法的基本实现。
更通用的替代方案是提供接口。或者,抽象类实际上可能实现了一个更通用的接口,它只定义了必须实现的方法。
换句话说,提供接口的优点是您不需要知道实现它的类。 使用抽象类的优点是,您可以添加或删除观察者并向其发送通知所需的方法的基本实现。你可以通过推导出类来利用这一点。
答案 1 :(得分:1)
使具体观察者依赖于具体主题将解决一个问题[在更新方法中将类型转换为更新(ConcreteSubject cs)],但代价是模式的通用性质。
具体主题和抽象主题(Observable)具有明确的职责划分,即 - 实施业务逻辑,并成为跨应用程序的Observable并负责观察员。
如果我们避免使用Subject,那么每个需要观察者的商业类(可能会在线下添加)都必须重复 Subject 的代码。 (从另一个具体主题扩展一个具体主题是OO违规)。
最好的方法是使用抽象主题和保持扩展和代码重用打开。