java设计模式“开-闭”原则的支持的原则:
里氏代换原则(LSP)
从“开-闭”原则中可以看出面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化。具体化可以给出不同的版本,每一个版本都给出不同的实现。
从抽象化到具体化的导出要使用继承关系和这里要引入的里氏代换原则。换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
比如。假设有两个类,一个是Base类,另一个是Derived类,并且Derived类是Base类的子类。那么一个方法如果可以接受一个基类对象b的话:
method(Base b)
那么它必然可以接受一个子类对象b,也即可以有method(d)。
里氏代换原则是继承复用的基石。只有当衍生类可以替换基类,软件单位的功能不会受到影响时,而衍生类也才能够在基类的基础上增加新的行为。
必须支出的是,反过来的代码则不成立,即如果一个软件实体使用的是一个子类的话,那么它不应适用于基类。如果一个方法method接受子类对象为参数的话:method(Deriver d)那么一般而言不可以有method(b)。
依赖倒装原则(DIP)
实现“开-闭”原则的关键是抽象化,并且从抽象化导出具体化实现。如果说“开-闭”原则是面向对象设计的目标的话,依赖倒装原则就是这个面向对象设计的主要机制。依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体。
合成/聚合复用原则
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。这个设计原则有另外一个更简短的表述:要尽量使用合成/聚合,尽量不要使用继承。
合成和聚合均是关联的特殊种类。聚合用来表示“拥有”关系或者整体与部分的关系;而合成则用来表示一种强得多的“拥有”关系。在一个合成关系里,部分和整体的生命周期是一样的。一个合成新的对像完全拥有对其组成部分的支配权。
接口隔离原则(LSP)
使用多个专门的接口比使用单一的总接口要好。换言之,从一个客户类的角度来讲,一个类对另外一个类的依赖性应当是建立在最小的接口上的。
迪米特法则(LoD)
一个对象应当对其他对象有尽可能少的了解。迪米特法则的表述
1. 只与你直接的朋友通信
2.不要跟“陌生人”说话
3.每一个软件单位对其他的单位都是只有最少的知识,而且局限于那些与本单位密切相关的软件单位。