面向对象特性
- 抽象
- 封装
- 继承
- 多态
面向对象设计原则
一般设计原则
摘自《Head First 设计模式》
- 封装变化
- 多用组合,少用继承:has-a 比 is-a 更灵活,可运行时改变行为/属性
- 针对接口编程,不针对实现编程:变量声明为超类型(接口/抽象类)
- 为交互对象之间的松耦合设计而努力(想想观察者模式如何将主题和观察者之间解耦)
- 类应该对扩展开放,对修改关闭
- 依赖抽象,不要依赖具体类(依赖倒置)
- 只和朋友交谈
- 别找我,我会找你:超类调用决定何时子类
- 类应该只有一个改变的理由
如何理解依赖? #include "Pizza.h"?
SOLID 原则
- S-单一职责
- O-开放关闭:对扩展开放,对修改关闭。扩展新功能不需要修改现有代码
- L-李氏替代:需要父类对象的地方可以用任何子类对象替代
- I-接口分离
-
D-依赖倒置
Denpendency Inversion Principle,常见于工厂方法。
强调“抽象”,不能让高层组件依赖低层组件。例如:不论是高层组件 PizzaStore(PizzaStore 行为由抽象 Pizza 定义)还是低层组件 ConcretePizza(实现了 Pizza 抽象接口)都依赖于 Pizza 接口。
依赖倒置指导方针
- 变量不可以持有具体类的引用——改用工厂,避免直接使用 new 持有具体类的引用
- 不要让类派生自具体类——派生自抽象类或接口,这样就不依赖具体类了
- 不要覆盖基类中已经实现的方法——说明不是一个真正适合被继承的抽象
DRY 原则
Don't Repeat Yourself 不要重复
KISS 原则
Keep It Simple and Stupid 保持简单