对扩展开放,对修改关闭
子类型必须能够替换掉父类型
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上
要尽量使用合成/聚合,尽量不要使用继承
一个对象应当对其他对象有尽可能少的了解,不和陌生人说话,松耦合原则
不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责,应该仅有一个引起它变化的原因
- 确保有且只有一个对象被创建
- 由子类决定创建的具体类是哪一个
- 允许客户创建对象的家族,而无需指定他们的具体类
- 封装一个产品的结构过程,并允许按步骤构造
- 向客户隐藏创建新实例的复杂性
- 包装一个对象,已提供新的行为
- 客户用一致的方式处理对象集合和单个对象
- 封装对象,并提供不同的接口
- 包装对象,以控制对此对象的访问
- 简化一群类的接口
- 不仅改变实现,也改变抽象
- 让一个类的实例能够用来提供许多“虚拟实例”
- 封装了基于状态的行为,并使用委托在行为之间切换
- 在对象的集合之间游走,而不暴露集合的实现
- 封装可以互换的行为,并使用委托决定要使用哪一个行为
- 让被观察对象能够在状态改变时通知观察者
- 由子类决定如何实现一个算法中的步骤
- 封装请求为对象
- 集中相关对象之间复杂的沟通和控制方式
- 允许对组合结构加入新的操作,而无需改变结构本身
- 让对象返回之前的状态
- 为语言创建解释器
- 让一个以上的对象有机会处理某个请求