开-闭原则(Open-Closee Principle
OCP)
一个软件实体,应当对扩展开放,对修改关闭。
要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强其功能的目的。
a. 里氏代换原则(LSP): 任何基类出现的地方,子类一定可以出现。
b. 依赖倒转原则(DIP): 要依赖于抽象,不要依赖于实现。
c. 合成/聚合复用原则(CARP): 要尽量使用合成/聚合,而不是继承关系达到复用的目的。
d. 接口隔离原则(ISP): 应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。
e. 迪米特法则(LoD): 一个软件实体应当与尽可能少的其他实体发生相互作用。
只与朋友通信而不与陌生人说话。朋友的定义如下:
·
1. 当前对象本身(this);
·
2. 以参量形式传入到当是对象方法中的对象;
·
3. 当前对象的实例变量直接引用的对象,如果当前对象的实例变量是一个聚集,则聚集中的元素都是朋友;
·
4. 当前对象所创建的对象。
·
以上法则的缺点是会产生很多小方法,降低效率,产生困惑。克服方法是使用依赖倒转原则,建立一个抽象陌生人。
将条件转移语句改写成为多态性。如果一个条件转移语句确实封闭了某种商务逻辑的可变性,此时将可变性封装起来才符合“开-闭”原则设计思想,否则就是“多态性污染”。
接口
单方法接口、标识接口。
不能使用常量接口。
抽象类
应尽可能不继承具体类而只继承抽象类。
应当拥有尽可能多的共同代码,以利于复用。数据应尽可能放到实现类,以减少内存占用。
联合使用接口和抽象类,即:定义一个接口,再定义一个抽象类实现这一接口,抽象类中将必要的方法实现。这样做的目的是因为子类只能有一个父类,如果只有抽象类,则类型定义的次要类型将很难做,如果只有接口,则无法对通用部分做实现。
这其实就是“缺省适配模式”。统一命名规范为:Abstract + 接口名,如:接口Collection,抽象类AbstractCollection。