设计模式:

原则(重要):依赖倒置原则

高层依赖于抽象,抽象不依赖过程

开放封闭原则:类模块应该开放扩展的,而其原先的代码尽量封闭不可改变。

单一职责原则:防止臃肿代码

替换原则:子类继承基类,在基类实现

接口隔离原则:接口应该小而完备,不该强迫用户使用多余的方法

优先使用对象组合而不是继承:

封装变化点:针对接口编程,而不是针对实现编程。

模板模式分类:

定义一个算法的骨架,将一些步骤延迟到子类中实现。这样可以使得算法框架和具体的实现分离,只进行改变其中需要改变的,在父类进行算法骨架的构造,子类进行详细实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>

using namespace std;

class CaffeineBeverage {
public:
void prepareRecipe() { // 准备饮料的流程
boilWater(); // 煮水
brew(); // 泡茶/咖啡
pourInCup(); // 倒入杯中
addCondiments(); // 加入调料
}

void boilWater() {
cout << "Boiling water" << endl;
}

void pourInCup() {
cout << "Pouring into cup" << endl;
}

virtual void brew() = 0; // 泡茶/咖啡等具体操作由子类实现

virtual void addCondiments() = 0; // 加入调料操作由子类实现
};

class Tea : public CaffeineBeverage {
public:
void brew() {
cout << "Steeping the tea" << endl;
}

void addCondiments() {
cout << "Adding Lemon" << endl;
}
};

class Coffee : public CaffeineBeverage {
public:
void brew() {
cout << "Dripping Coffee through filter" << endl;
}

void addCondiments() {
cout << "Adding Sugar and Milk" << endl;
}
};

int main() {
Tea myTea;
Coffee myCoffee;

cout << "Making tea..." << endl;
myTea.prepareRecipe();

cout << endl;

cout << "Making coffee..." << endl;
myCoffee.prepareRecipe();

return 0;
}
在这个示例中,我们使用模板方法模式定义了一个咖啡因饮料制作流程,包括煮水、泡茶/咖啡、倒入杯中和加入调料等步骤。其中 CaffeineBeverage 类是抽象类,定义了 prepareRecipe() 模板方法和煮水、倒入杯中等辅助方法,而将泡茶/咖啡和加入调料等具体操作留给了子类来实现。

我们通过 Tea 和 Coffee 两个子类来实现对应的咖啡因饮料制作流程,并实现其特有的泡茶和加入柠檬、滴咖啡和加牛奶糖等等特有的操作。最后在 main() 函数中,我们按照模板方法的流程来制作茶和咖啡,并且调用了相应子类的泡茶/咖啡和加入调料等方法

策略模式:

定义一系列算法,将它们封装起来,并且可以互相替。

image-20230517164404046

image-20230517165420675

观察者模式:

对象中一对多的依赖管理,当其中一个对象改变的时候,通过该对象的改变通知其他依赖于观察者的对象进行改变,不需要改变,查看观察者依赖

image-20230517171114063

装饰模式:

过度使用继承来扩展对象,使子类膨胀,动态地给一个对象添加一些额外的职责,而不需要对其进行子类化扩展。

工厂模式:

解定义一个创建对象的接口让子类决定实例化哪一类,适用于具有相同结构但不同行为的对象创建,隐藏new的细节。比如同一个披萨店可以生产多种口味的披萨。工厂类:

image-20230517202550148

image-20230517202654705

抽象工程模式:

解决依赖一系列的对象创建工作,将所有的相同的工厂再次封装位一个抽象工厂

image-20230517204807480

单例模式singleton:确保类在系统中只有一个实例,将构造函数和拷贝构造函数都设为priveta。

线程安全,加锁

加双锁不能用:

image-20230517211227682

image-20230517210613080

image-20230517211057030

适配器模式(接口模式):
将一个类的接口转换成客户希望的另外一个接口。

迭代器模式(数据结构模式):

提供一种方式访问一个容器对象中的各个元素,而不需要暴露该对象的内部结构。