- 使用设计模式的目的:分离时间维度上的稳定和变化
- 设计模式的最重要两大原则:开闭原则(开放拓展,关闭修改),依赖倒置
- 常用的五大设计模式:策略模式,工厂模式,抽象工厂,单例模式,模板模式
策略模式
- 目的:统一子类的接口,将每个子类独立封装,互相之间可以相互替代,根据需要灵活替代
- 继承结构:定义一个基类作为父类,定义父类的虚函数作为接口。定义子类继承父类并重写
- 使用时:定义一个基类的指针指向一个子类的实例化对象,调用基类指针的接口函数,因为该函数为虚函数,在运行时会体现出动态多态的特点,实际运行中会调用子类的重写函数
class BaseClass {
public:
virtual void calculate() = 0;
}
class SonClass: public BaseClass {
public:
void claculate() {
// implementation
}
}
BaseClass* base = new SonClass();
base->calculate();
工厂模式
- 目的:解决对象创建过程中接口的紧耦合问题
- 继承结构:定义一个基类工厂类作为父类,定义父类的虚函数create()作为接口。定义子类继承父类并重写create()函数
class ISplitter { };
class RealSplitter : public ISplitter {};
class BaseFactory {
public:
virtual ISplitter* create() = 0;
}
class RealFactory {
public:
virtual ISplitter* create() {
return new RealSplitter();
}
}
RealFactory real_factory = new RealFactory();
RealSplitter real_splitter = real_factory.create();
抽象工厂
- 目的:解决一系列前后相关的对象创建过程中的依赖关系
- 场景:假设存在Redis,MySql,Redis三种不同的数据库,实际开发中从数据库中读取数据需要三个操作:获取权限,连接,读取。对于不同数据库的三个操作无法混用,因此工厂模式将三个操作统一封装进一个抽象工厂
单例模式
模板模式
- 场景:项目中的某个功能是固定执行多个具有不同先后顺序的步骤,其中的部分步骤已由库函数提供,部分步骤需要用户自定义。模板模式就是将该规定好的步骤封装到库函数中,减少用户需要了解的上下文内容,专注于需要开发的内容
// 库函数部分
class Library {
public:
void Run() {
step1();
step2();
step3();
step4();
step5();
}
protected:
void step1() {
cout << "i am step 1" << endl;
}
void step2() {
cout << "i am step 2" << endl;
}
void step3() {
cout << "i am step 3" << endl;
}
virtual void step4() = 0;
virtual void step5() = 0;
};
// 用户部分
class Application: public Library {
protected:
bool step4() {
cout << "i am step 4" << endl;
}
void step5() {
cout << "i am step 5" << endl;
}
};
int main() {
Library* lib = new Application();
lib->Run();
return 0;
}