本文根据李建忠老师C++设计模式编写.是对李建忠老师视频课程的一个总结.
文章目录
面向对象设计原则
依赖倒置原则
- 稳定的高层模块不应该依赖变化的底层模块,二者都应该依赖于稳定的抽象.
- 稳定的抽象不应该依赖于变化的实现细节,实现细节应该依赖于稳定的抽象.
开放封闭原则
- 对扩展开放,对更改封闭.
- 类模块应该是可扩展的,但不可修改.
单一职责原则
- 一个类应该仅有一个引起它变化的原因.
- 变化的方向隐含着类的责任.
Liskov替换原则
- 子类必须能够替换它们的父类.
接口隔离原则
- 不应该强迫User使用他们不用的方法.
- 接口应该小而完备
优先使用对象组合而非类继承
- 继承在某种程度上破坏了封装性,子类父类耦合度过高.
- 对象组合只要求被组合的对象具有良好定义的接口,耦合度低.
封装点变化
- 使用封装来创建对象之间的分界层,让设计者在分界一侧修改而不改变对另一侧的影响.
针对接口编程而非针对实现编程
- 不将变量类型声明为某个具体类而是声明为某个抽象接口.
- User无需知道对象具体类型,只需知道对象具有的接口.
- 减少系统中各部分的依赖关系,高内聚,低耦合.
写代码时,不要直接使用设计模式,而是要重构到某种模式.
Template Method
使用场景
- 某项任务具有稳定的整体结构,但每个子步骤有很多改变的需求.
class Library {
public:
void step1() {
}
void step3() {
}
void step5() {
}
};
class Application {
public:
bool step2() {
}
void step4() {
}
};
int main() {
Library lib;
Application app;
lib.step1();
if (app.step2()) {
lib.step3();
}
for (int i = 0; i < 4; ++i) {
app.step4();
}
lib.step5();
}
main函数中的流程稳定,Application开发人员除了编写class Application,还要编写main流程.稳定的main流程应该应用Template Method.
class Library {
public:
void step1() {
}
void step3() {
}
void step5() {
}
virtual bool step2() = 0;
virtual void step4() = 0;
void run() {
step1();
if (step2()) {
step3();
}
for (int i = 0; i < 4; ++i) {
step4();
}
step5();
}
virtual ~Library();
};
class Application : public Library {
protected://作为public让外界调用没有意义,仅用来重写Library的方法。
virtual bool step2() {
}
virtual void step4() {
}
};
int main() {
Library* pLib = new Application;
pLib->run();
delete pLib;
}