C++中的设计模式

要搞清楚设计模式,首先得要了解UML中的类的一些关系模型。

一.UML图中与类的层次关系

UML关系:继承关系(泛化关系);组合关系;聚合关系;关联关系;依赖关系;

以上关系强度 依次减弱。

1.继承关系

继承关系是最直接的父子关系,如麻雀和老鹰都继承自鸟类,属于子类继承自父类,所以UML中子类实线+空心三角箭头指向父类;

2.组合关系

组合关系是某个类是由某些部位组合起来形成,如人和人的手臂,人的心脏,人的脚趾,就是组合关系,而手臂心脏不能离开人独立存活,所以UML图中用 心脏,手臂,脚趾,画直线+实心菱形箭头,指向人的类;

3.聚合关系

聚合关系是多个不同的类作为元素模块聚合成一个新的模块,如森林中包含植物动物阳光等,所以用实线+空心菱形箭头指向森林的类;

4.关联关系

关联关系有单向关联,双向关联,自关联三种,是两个平等的类中包含一种联系,如男人和女人两个类中的有个配偶,就是对方的类对象,所以关联关系用实线+三角箭头指向;

5.依赖关系

依赖关系是原本没有任何联系的两个类,因为某些业务功能需要,一个类依赖另一个类的一些功能,如人的类依赖车的类出行,依赖衣服类保暖,只是为了出行和保暖需要,如果不要这种出行功能,就可以去掉这种依赖关系的,所以是虚线+箭头指向依赖的类;

二.设计模式中的设计原则

1.单一职责原则

每个类都有一个明确的设计职责

2.开放封闭原则

设计要保持开放性,以便扩展,也要关闭修改,以限制代码变动,即类内封闭,类外开放

3.里氏代换原则

子类能替换他的父类型

4.依赖倒转原则

面向接口编程依赖于抽象类而非具体的实现

5.接口隔离原则

接口最小化,仅提供真正需要的接口

6.迪米特法则(最小知道原则)

一个对象不应与其他对象的内部状态发生过多关联

三.设计模式

1.单例模式:

只提供一个实例,对于单个资源处理,不能被继承,没有子类

饿汉模式:直接创建对象,线程安全的

懒汉模式:在使用中创建对象,线程不安全,需要双重检查锁定保证线程安全

2.简单工厂模式

只有一个工厂类

通过多态实现多种产品的生产

不遵循开闭原则

3.工厂模式

遵循开闭原则

有多个工厂类

每个工厂类用于生产专属的产品对象

创建对象的类不需要提供抽象类

通过继承和实现接口来创建不懂的实例对象

4.抽象工厂模式

有多个工厂类

遵循开闭原则

提供一个产品家族的抽象类型

子类定义如何生产出产品的方法

5.策略模式:

定义了一系列算法,并将每个算法封装起来,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理,常用来替换多层if...else,缺点是策略模式只适用于客户端知道所有的算法或行为的情况。

环境类:Context 环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

6.模板模式

定义一系列抽象的流程步骤

流程步骤在不同的子类种被重写以实现其不同展现

如果父类中某些流程步骤可变的方法太多,会导致其实现的子类就相应增加

7.原型模式

父类指向子类的拷贝构造

子类通过接口返回一个自己的实例对象

常用于克隆多个实例(不同子类)

8.组合模式

子节点跟随父节点一起销毁

9.聚合模式

子节点不跟随父节点一起销毁,可以独立生存

10.外观模式

上层接口:给很多复杂的子系统提供一个简单的上层接口,并在这些接口中包含用户真正关心的功能

底层模块:做好各个后台功能

底层模块与上层调用是一种关联关系

11.观察者模式

又叫订阅模式,两个类分别是观察者和被观察者,互相包含

被观察者include所有观察者(或者其抽象),并在类中提供添加和去除订阅者接口来维护一个列表保存所有观察者,并实现一个通知消息的接口,当某个状态变化需要通知订阅者时,变通过通知消息接口,调用各个观察者的响应接口;

观察者(订阅者)通过include被观察者(获取抽象类),调用其添加和去除订阅者的接口来实现参与订阅和取消订阅,并实现一个接收消息通知的对外接口,以供被观察者调用来发送消息。

相关推荐
代码中介商12 分钟前
C++运行时多态深度解析:从原理到实践
开发语言·c++·多态·虚函数
额呃呃22 分钟前
Andriod项目番茄钟
java·开发语言
Via_Neo23 分钟前
不能对方法返回值进行赋值
开发语言·python
梅孔立28 分钟前
Java 基于 POI 模板 Excel 导出工具类 双数据源 + 自动合并单元格 + 自适应行高 完整实战
java·开发语言·excel
代码中介商29 分钟前
C++ 继承与派生深度解析:存储布局、构造析构与高级特性
开发语言·c++·继承·派生
我不是懒洋洋36 分钟前
【经典题目】栈和队列面试题(括号匹配问题、用队列实现栈、设计循环队列、用栈实现队列)
c语言·开发语言·数据结构·算法·leetcode·链表·ecmascript
枫叶丹437 分钟前
【HarmonyOS 6.0】ArkWeb PDF浏览能力增强:指定PDF文档背景色功能详解
开发语言·华为·pdf·harmonyos
谭欣辰39 分钟前
C++ 控制台跑酷小游戏2.0
开发语言·c++·游戏程序
Huangxy__44 分钟前
java相机手搓(后续是文件保存以及接入大模型)
java·开发语言·数码相机
刚子编程1 小时前
C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生
开发语言·c#·事务处理·trycatch