依赖倒置原则
- 高层模块不依赖于底层模块,两者依赖于抽象;
- 抽象不依赖于细节,细节应依赖于抽象;
实际项目开发中,应该以构建一种能力为目的,开发一个模块不能只考虑当前功能的实现,应使代码具有良好的扩展性。
开放封闭原则
- 对扩展开放,对更改封闭;
- 类模块应该是可扩展的;
- 我们在定义接口后尽可能保证接口层稳定
在设计程序之初,应充分考虑接口的稳定性,在需求需要更改的情况下,尽量保持原有接口不改变,而是通过新加接口来实现功能。
单一职责原则
- 一个类尽量只实现一个功能,这样使类变化的原因会减少;
- 如果一个类变化的部分过多,这样使程序的维护难度增加;
Liskov替换原则
- 子类必须能够替换他们的基类;
- 继承表达类型的抽象
接口隔离原则
- 如果只是本类使用的方法置为private,如果是子类要使用的方法就置为protected;
- 对外暴漏的方法置为public;
这个原则可以参考Qt的设计框架。举个例子,例如Qt中的鼠标、键盘等事件被置为protected,子类继承QWidget等基类的时候,可以重写这些事件。
优先使用对象组合,而不是类继承
- 类继承通常使用"白箱复用",对象组合通常为"黑箱复用";
- 继承在某种成都上破坏了封装性,继承会导致子类和父类的耦合度增高;
- 对象组合要求定义良好的接口;
封装变化点
使用封装来创建对象之间的分界层,使一侧变化,一侧稳定;
针对接口编程,而不是针对实现编程
- 不将变量类型声明为某个特定的具体类,而是声明为某个接口;
- 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口;
- 减少系统各个部分之间的依赖关系,实现高内聚,低耦合;