1 设计模式的学习
设计模式是不同场景下所提出比较好的解决方案,因此设计模式的学习最好是根据场景,而不是根据理论学习。
2 设计模式的分类
设计模式有很多种,其中有23种是其他设计模式的基础,把这23种进行分类如下图所示:
创建型模式:抽象了对象实例化过程,用来帮助创建对象的实例。
结构型模式:描述如何组合类和对象以获得更大的结构。
行为型模式:描述算法和对象间职责的分配。
3 设计模式与设计原则关系
采用设计模式的目的:为了增强代码的复用性,增加可维护性。基于这些目的提出来一系列原则:单一职责原则、迪米特原则、开闭原则等。在这些原则的基础上进行代码实现,形成了各种设计模式,原则的提出是具有理想性的,在代码中只能是尽可能的满足这些原则
4 开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。实现思路:面向抽象编程,用抽象构建框架,用实现扩展细节。优点:提高软件的可复用、可维护性。具体实现:当需要对某一类添加功能时,采用写一个子类继承该类,然后在该子类上写需要添加的功能。
5 依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象。实现思路:抽象不应该依赖细节,让细节依赖抽象。优点:减少类间的耦合性,提高可维护性,降低修改程序所造成的风险。高层模块:一般是指应用层有具体的业务逻辑,低层模块:实现业务所依赖的类。具体实现:可参考工厂模式中的植物大战僵尸例子,function相对三种植物为高层模块,main方法相对function类为高层模块。一开始为面向实现编程,function直接和三种对象关联,为了降低耦合创建了plant接口,为面向接口编程。在创建完简单工厂模式后,高层function模块便不是依赖低层的三个对象了而是依赖工厂类。
6 单一职责原则
定义:不要存在多于一个导致类变更的原因。实现思路:一个类、接口、方法只负责一项职责。优点:降低类的复杂度,提高类的可读性、可维护性,降低变更引起的风险。变更一定是存在的,当修改一个功能时,可以降低对其他功能的影响。
7 接口隔离原则
定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口。实现思路:一个类对一个类(泛指的类接口也可叫做一个类)的依赖应该建立在最下的接口上;建立单一的接口,不要建立庞大臃肿的接口;尽量细化接口,每一个接口中的方法尽量少。优点:符合高内聚低耦合的设计思想。注意:要适度,不要过分的细化接口。适度原则使用与前面所有的原则比如抽象时也要适度,不要过分抽象,这样反而会令程序变得更加复杂。
8 迪米特原则
一个对象应该对其他对象保持最少的了解即类中尽量少用public变量方法。强调只和朋友交流不会陌生人说话,即引入的外部类越少越好。朋友:出现在成员变量,方法输入、输出参数中的类为朋友类,出现在方法体内部的类不是朋友类。优点:减少类的耦合。注意:同样要注意适度原则,否则会出现大量的中间类,导致程序变得复杂。
9 里氏代换原则
定义:任何基类可以出现的地方,子类一定可以出现,即只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
10 合成复用原则
定义:尽量使用合成/聚合的方式,而不是使用继承。
11 界面与接口
在设计模式分析中界面不是传统的图形界面,可能是一个类或者多个类组成的部分;接口不仅仅指Java中传统的interface,也有可能是一个类,主要看这个类所扮演的角色。
0