C++ 设计模式之设计原则
设计模式中的设计原则是指导软件设计的基本准则,旨在提高代码的可维护性、可扩展性和灵活性。这些原则帮助开发者编写出更健壮、更易于理解和更易于修改的代码。以下是一些关键的设计原则及其总结:
1. 单一职责原则
原则:一个类应该只有一个引起变化的原因,即一个类只负责一个职责。
优点:
- 提高类的内聚性。
- 降低类的复杂度。
- 提高代码的可维护性和可读性。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class ReportGenerator { public: void generateReport() { } };
class ReportPrinter { public: void printReport() { } };
|
2. 开放封闭原则
原则:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
优点:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Shape { public: virtual void draw() const = 0; virtual ~Shape() = default; };
class Circle : public Shape { public: void draw() const override { } };
class Rectangle : public Shape { public: void draw() const override { } };
|
3. 里氏替换原则
原则:派生类对象应该能够替换基类对象而不影响程序的正确性。
优点:
- 保证继承关系的正确性。
- 提高代码的可替换性和可扩展性。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Bird { public: virtual void fly() const { } };
class Sparrow : public Bird { public: void fly() const override { } };
|
4. 接口隔离原则
原则:一个类不应该依赖于它不使用的接口。应将接口拆分为更小、更专注的接口。
优点:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Printer { public: virtual void print() const = 0; virtual ~Printer() = default; };
class Scanner { public: virtual void scan() const = 0; virtual ~Scanner() = default; };
class MultiFunctionPrinter : public Printer, public Scanner { public: void print() const override { }
void scan() const override { } };
|
5. 依赖倒置原则
原则:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
优点:
- 提高代码的灵活性和可扩展性。
- 降低模块之间的耦合度。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class IWorker { public: virtual void work() const = 0; virtual ~IWorker() = default; };
class Worker : public IWorker { public: void work() const override { } };
class Manager { public: Manager(IWorker* worker) : worker_(worker) {}
void manage() const { worker_->work(); }
private: IWorker* worker_; };
|
设计模式中的设计原则总结
- 单一职责原则(SRP):一个类只负责一个职责。
- 开放封闭原则(OCP):软件实体应该对扩展开放,对修改封闭。
- 里氏替换原则(LSP):派生类对象应该能够替换基类对象而不影响程序的正确性。
- 接口隔离原则(ISP):一个类不应该依赖于它不使用的接口。
- 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。