设计模式学习基础原则
开闭原则
1. 什么是“开-闭”原则
“开-闭”原则(Open-Closed Principle,缩写OCP)讲的是:一个实体应当对扩展开放,对修改关闭。在设计一个模块的时候,应该使这个模块可以在不被修改的前提下被扩展。
2. “开-闭”原则的优点
1)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
2)已有的软件模块,特别是重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
3. 怎样做到“开-闭”原则在其他设计模式中的体现
1)抽象化。在java语言中,可以给出一个或多个抽象类或者接口,规定出所有的具体类的必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都会改变。这就满足了“开-闭”原则中“对修改关闭”这一条。同时,由于从抽象层导出了一个或多个新的具体类可以改变系统的具体行为,因此系统的设计对扩展是开放的,这又满足了“开-闭”原则中“对扩展开放”。
2)对可变性的封装。“开-闭”原则从另外一个角度讲述,就是所谓的“对可变性封装的原则”。考虑你的设计中有什么可能会发生变化,这些变化不会导致重新设计。用一句话总结就是:“找到一个系统的可变因素,将它封装起来”。
里氏代换原则
里氏代换原则的严格表述:如果对每一个类型T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有对象o1都代换成对象o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。
换言之,一个软件实体如果使用的是基类的话,那么一定适用于其子类。
依赖倒转原则
抽象不应当依赖于细节;细节应当依赖于抽象。另外一种表述是:要针对接口编程,不要针对实现编程。
接口隔离原则
将“接口”理解为一个类所提供的所有方法的特征集合,也就是一种在逻辑上才存在的概念。这样的话,接口的划分就直接带来了类型的划分。
一个接口就相当于剧本中的角色,而此角色在舞台上由哪一个演员来演相当于接口的实现。因此一个接口应当简洁地代表一个角色,而不是多个角色。如果系统涉及到多个角色的话,每一个角色都应当有一个特定的接口代表。
如果将一些没有关系的接口合并在一起,形成一个臃肿的大接口,是对角色和接口的污染。
合成/聚合复用原则
合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。更简洁的描述是:要尽量使用合成/聚合,尽量不要使用继承。
迪米特法则
迪米特法则又叫最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解(对象之间的相互作用尽量少)。