观察者模式:间接依赖vs.直接依赖

双向依赖问题


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖

编译错误:


观察者模式:间接依赖vs.直接依赖

双向依赖问题——通过宏防止头文件重复包含


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖

通过宏无法解决双向依赖的问题:


观察者模式:间接依赖vs.直接依赖

双向依赖解决方案


类B在类A之前被定义(在定义类A之前必须包含类B的头文件或完整的声明代码):

1.类A继承自类B;

2.类A聚合了类B的对象;

3.类A的头文件中使用了类B的属性或方法;

在C++语言里,如果一定需要双向依赖,那么至少有一个方向的关系必须是用指针实现的弱依赖关系。如果类A的头文件中只定义了类B的一个指针,没有使用类B中的任何属性和方法,C++编译器就不要求类B在类A之前被定义了。在定义类A时只需要告诉编译器还有一个类B的存在。


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖

包的双向依赖问题

双向依赖会造成软件代码之间、组件之间、包或子系统之间的强烈耦合关系,对于需要适应不同需求和不同平台的系统,当相互依赖的两个包之间,任何一个包的接口发生变化,另一个包就要相应地进行修改。

观察者模式设计意图

1.定义对象之间多对一的依赖关系,也即多个对象依赖于一个对象的关系,同事保证,当被依赖的对象状态发生变化时,所有的依赖者会被自动地通知。(出版-订阅模式)

被依赖的对象向外发布自己的状态,而此前订阅了该状态的所有对象都会得到通知——这其实类似于一种消息在对象间的广播。

2.当一个对象需要通知另外一些对象,而你无法预知某些对象将被通知时,通过观察者模式就可以减弱通知对象和被通知对象之间的耦合关系。

3.当一个模块(模块A)的变化需要另一个模块(模块B)做出相应的修改,而你不知道有多少个类会被修改时,使用观察者模式就可以切断这种依赖关系,即模块A的变化不再影响模块B,模块B也无需做任何修改。模块B对模块A的依赖关系由直接依赖转变为间接依赖,具体的依赖关系是由模块A动态设定的。因此两个模块可以在互不干扰的情况下,相对独立地被复用和修改。

观察者模式——基本结构


观察者模式:间接依赖vs.直接依赖

1.主体类:被观察者类的基类,它管理所有的观察者,并提供添加和删除观察者的方法,观察者的数量一般不受限制;

2.观察者类:定义一个通知接口用以接收主体类发来的通知消息;

3.具体的主体类:具体的被观察类,它针对不同的需求,实现具体的主体属性和方法,决定何时发送通知消息等。

4.具体的观察者类:针对不同的需求,实现具体的通知接口,以接受具体的主体类发来的通知消息,并可以根据需要对消息进行特定的处理。

观察者模式——实现方式(Java)


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式——实现方式(C++)


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


观察者模式:间接依赖vs.直接依赖


分享到:


相關文章: