Head First中的设计原则总结:
一、封装变化
二、多用组合,少用继承
三、针对接口编程,不针对实现编程
四、为交互对象之间的松耦合设计而努力
五、类应该对扩展开放,对修改关闭
六、依赖抽象,不要依赖具体类
七、只和朋友交谈
八、别找我,我会找你
九、类应该只有一个改变的理由
开-闭原则(open-closed principle或OCP)
所谓开-闭原则:就是在设计模块时,应当使这个模块可以在不被修改的前提下被扩展,也就是说对扩展开放,对修改关闭
那么如何实现开-闭原则呢?
方法是:
1、抽象,在JAVA里以接口或者是抽象类实现
2、对可变性进行封装,也就是说将散落在各个角落的可变的代码封装到一个对象里,然后使用继承来实现同一种可变性的不同表象,继承应当被看成是封装变化的方法,而不应当被认为是从一般对象生成特殊对象的方法,其次,一种可变性不应当与另一种可变性混合在一起,一般继承结构不宜超过两层
里氏代换原则(Liskov substitution principle 或LSP)
所谓里氏代换原则是:任何基类出现的地方,子类一定可以出现。该原则是开闭原则的补充,实现开闭原则的关键步骤是抽象化。而基类与子类的继承关系就是抽象化的具体体现,所以里氏代换原则是实现对抽象化的具体步骤的规范,一般来说,违反里氏代换原则,一定违反开闭原则,反之,不成立
依赖倒转原则(Dependency Inversion principle或DIP)
简单地讲所谓依赖倒转原则就是针对接口编程,而不是针对实现编程。
这里讲一下面向对象中两个类发生的三种不同的耦合关系:
l 零耦合:就是两个类没有耦合关系
l 具体耦合:就是发生在两个具体类之间,经由一个类对另一个类的直接引用造成的
l 抽象耦合:就是一个具体类和一个抽象类之间的关系
接口隔离原则(Interface Segregation Principle或ISP)
前面讲了依赖倒转原则是针对接口编程,在针对接口编程时,需要注意的是使用多个专门的接口比使用一个单一的大接口要好。如何理解呢?
比如,把人早上睡醒后的一系列动作设计为一个大接口的话,该接口可能包含叠被子、刷牙、洗脸、洗澡、上厕所,吃早饭这些方法,那么这一接口被一动物继承是否合适呢?我认为不太合适,因为动物可能不需要叠被子、刷牙、洗脸,而只需要上厕所,吃早饭。如果动物继承了这一个大接口,那么就不得不实现叠被子、刷牙、洗脸成空方法。那么是否可以将叠被子、刷牙、洗脸设计为一接口,把叠被子、刷牙、洗脸设计为另一接口呢?这就是接口隔离原则
合成/聚合复用原则(Composition/Aggregation Principle或CARP)
合成/聚合复用原则简单地讲就是要尽量使用合成/聚合,尽量不使用继承
迪米特法则(Law of Demeter或LoD)
所谓迪米特法则就是
l 只与你直接的朋友通信
l 不要与陌生人说话
l 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与单位密切相关的软件单位