设计模式:
原则(重要):依赖倒置原则
高层依赖于抽象,抽象不依赖过程
开放封闭原则:类模块应该开放扩展的,而其原先的代码尽量封闭不可改变。
单一职责原则:防止臃肿代码
替换原则:子类继承基类,在基类实现
接口隔离原则:接口应该小而完备,不该强迫用户使用多余的方法
优先使用对象组合而不是继承:
封装变化点:针对接口编程,而不是针对实现编程。
模板模式分类:
定义一个算法的骨架,将一些步骤延迟到子类中实现。这样可以使得算法框架和具体的实现分离,只进行改变其中需要改变的,在父类进行算法骨架的构造,子类进行详细实现
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() 函数中,我们按照模板方法的流程来制作茶和咖啡,并且调用了相应子类的泡茶/咖啡和加入调料等方法
|
策略模式:
定义一系列算法,将它们封装起来,并且可以互相替。


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

装饰模式:
过度使用继承来扩展对象,使子类膨胀,动态地给一个对象添加一些额外的职责,而不需要对其进行子类化扩展。
工厂模式:
解定义一个创建对象的接口让子类决定实例化哪一类,适用于具有相同结构但不同行为的对象创建,隐藏new的细节。比如同一个披萨店可以生产多种口味的披萨。工厂类:


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

单例模式singleton:确保类在系统中只有一个实例,将构造函数和拷贝构造函数都设为priveta。
线程安全,加锁
加双锁不能用:



适配器模式(接口模式):
将一个类的接口转换成客户希望的另外一个接口。
迭代器模式(数据结构模式):
提供一种方式访问一个容器对象中的各个元素,而不需要暴露该对象的内部结构。