欢迎来到军工软件开发人才培养基地——学到牛牛

技术文章分享|吃透设计模式之观察者模式

时间:2024-05-06 07:01:10 来源:学到牛牛

观察者(Observer)模式又称发布-订阅(Publish-Subscribe)模式,它描述的是一个一对多的关系,当一个对象改变时通知其他对应的观察对象做出对应的自动更新改变。类似我们读书时老师和学生的关系,学生就是观察者,老师就是被观察的对象,学生时刻注意着老师的状态变化而自动做出相应反应,用发布订阅来理解就是老师发布状态变化结果,学员订阅这些状态做出应对。

 

下面是观察者模式的UML图:

在实现观察者模式时主要就是要将观察者及观察主题的抽象接口定义好,将类的依赖关系转换到抽象的基类中去,这样就可以避免具体观察对象编译时的依赖关系,降低耦合;观察者就可以自动根据订阅的主题信息根据主题自动更新自己的状态。它的缺点在于当观察者较多时通知观察者时需要遍历而带来的性能开销,另外就是当观察者销毁前也需要被观察对象先删除观察者对象,不然遍历到已销毁对象会导致程序崩溃;

在实际的应用中常见的Qt中的信号与槽实现、MVC(模型视图控制)等都可以看成是一种观察者模式,我们这里以游戏中等级与装备、属性和技能为例构建了一个简单的观察者模式,等级就是具体的观察主题,而装备装备、属性和技能系统就可以看成是具体的观察者,我们可以自由的根据抽象的观察者接口去扩展更多具体观察者类;这些具体的观察者就可以根据观察的主题变化而自动适应更新。如下图等级的提升可带来属性、装备等的提升:

下面是具体的实现代码:

1. 抽象观察者类定义

2. 抽象被观察对象类定义

3. 具体被观察对象类定义:角色等级类

4. 具体观察者类定义,这里可自由扩展

 

5. 主函数功能测试代码

程序运行结果:

观察者模式也是一个非常常用的设计模式,需要我们多多熟悉,以上就是一个简单的实现测试,实际使用时可能会结合多种设计模式是的其结构变得复杂,所以就需要从最简单的开始,搞懂各种设计模式的结构及特点,才能真正做到融会贯通。