面向对象特性
抽象、 封装、继承、多态
面向对象设计原则
一般设计原则
摘自《Head First 设计模式》
- 封装变化
- 多用组合,少用继承:has-a 比 is-a 更灵活,可运行时改变行为/属性
- 针对接口编程,不针对实现编程:变量声明为超类型(接口/抽象类)
- 为交互对象之间的松耦合设计而努力(例如观察者和被观察者之间通过接口解耦)
- 开放关闭原则:类应该对扩展开放,对修改关闭。扩展新功能不需要修改现有代码(如增加新的观察者不需要改变被观察者代码)。应用于观察者、装饰者模式。
- 依赖倒置原则(Denpendency Inversion Principle):依赖抽象,不要依赖具体类。强调“抽象”,不能让高层组件依赖低层组件。常应用于工厂方法模式:例如,不论是高层组件 PizzaStore(PizzaStore 行为由抽象 Pizza 定义)还是低层组件 ConcretePizza(实现了 Pizza 抽象接口)都依赖于 Pizza 接口。
- 最少知识原则(Least Knowledge Principle,Law of Demeter):减少对象之间的交互,不要让太多的类耦合在一起。实际开发中,对象应尽可能地避免调用由另一个方法返回的对象的方法。常应用于外观模式:例如 Client 之和 HomeTheaterFacade 交互
- 好莱坞原则(别找我,我会找你):允许低层组件将自己挂钩(hook)到系统上,但是高层组件(超类)决定什么时候和怎样使用这些低层组件(子类)。常应用于模板方法、工厂方法、观察者等模式:如子类实现模板方法中的某几个方法;工厂方法子类决定如何创建具体对象等。
- 单一责任原则:类应该只有一个改变的理由
如何理解依赖? #include "Pizza.h"?
SOLID 原则
- S-单一职责原则
- O-开放关闭原则
- L-李氏替代原则:使用基类对象指针或引用的函数必须能够在不了解衍生类的条件下使用衍生类的对象。
- I-接口分离原则:接口不是为特定的客户类服务,而服务了多个不同的客户类。胖接口使本应该被隔离的客户类之间产生了耦合。通过应用 Adapter 设计模式,采用委托(delegation)或多继承方式,胖接口可以被分离成多个抽象的基类接口,从而打破客户类之间的不必要的耦合。
- D-依赖倒置原则
依赖倒置指导方针
- 变量不可以持有具体类的引用——改用工厂,避免直接使用 new 持有具体类的引用
- 不要让类派生自具体类——派生自抽象类或接口,这样就不依赖具体类了
- 不要覆盖基类中已经实现的方法——说明不是一个真正适合被继承的抽象
DRY 原则
Don't Repeat Yourself 不要重复
KISS 原则
Keep It Simple and Stupid 保持简单