设计模式培训文档
培训目的
- 清楚设计模式的应用场景
- 了解设计模式的结构
- 清楚相似设计模式的区别
- 答疑
设计模式原则
- 单一职责原则
一个类只负责一项职责 - 里氏替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。 - 依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 - 接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 - 迪米特法则
一个对象应该对其他对象保持最少的了解。 - 开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
设计模式划分
个人设计模式学习意见,未参考正规渠道
7个必须会,说到该设计模式就能想到结构图
8个清楚结构及作用
8个了解应用场景
七个必会的设计模式
1. 单例模式
①:保持该类只存在一个实例
②:不使用静态方法的原因:静态方法违背java面像对象的设计思想
谨记:若代码结构设计中存在了大量的静态方法,需重新考虑代码结构设计
③:单例模式类中不应存在可变的成员属性
2. 工厂模式
①:根据传递的参数创建不同的对象
3. 适配器模式
①:将某对象,封装为某特定要求的对象
4. 代理模式
①:为其他对象提供一种代理以控制对这个对象的访问。
②:与适配器模式的区别
适配器:只对功能进行适配处理,不对功能本身做控制及增加,为了适配,方法名与类接口肯定不一致
代理模式:实现对原对象的控制,因为实现的是对原功能的处理,所以通常方法名与代理的方法名一致
5. 装饰模式
①:对原有对象方法装饰新的功能
②:与代理模式的区别
代理模式:同上
装饰模式:不对原有对象控制,只对方法体添加功能,对象可通过构造等方式传入
区别总结为:在加载类时,若确定方法调用对象即为代理,否则为装饰
6. 策略模式
①:将一组算法实现同一接口,以参数的形式将算法的实现类传入公共方法体中
7. 模板模式
在抽象类中定义功能实现的步骤方法,并将不同子类实现不同的方法定义为抽象方法由子类实现
8个清楚结构及作用的设计模式
1. 抽象工厂模式
①:所有对象存在共同的接口,并且存在抽象工厂类,当新增对象时,新写工厂实现类
②:相比工厂模式的优势:新增对象时,在不修改之前代码的情况下实现拓展
2. 建造者模式
①:创建复杂对象时,将对象拆分为n步处理,每步调用不同的类方法体实现
3. 外观模式
①:将复杂的程序对外只提供一个类,隐藏内部的复杂逻辑,内部的逻辑只在外观类及其它内部的类中调用
②:与建造者的区别:建造者模式为创造型模式,外观模式为结构型模式,虽然两者都是将复杂的对象提供一个对外的简单接口,但是根本上有很大的 区别
4. 原型模式
①:通过类中某个方法克隆出一个与实例相同的对象
②:通常的克隆方式:深克隆,浅克隆
③:虽然object类中存在clone方法,但是不可直接调用,必须 实现 clonable接口
5. 桥接模式
①:桥接模式就是把事物和其具体实现分离,使他们可以各自独立的变化。=
②:与策略模式的区别
策略模式:只是将算法独立出一组实现某一接口的实现类,其它逻辑统一,在其它逻辑中根据传入的算法对象调用相应的算法
桥接模式:建立算法的接口及逻辑的抽象类,将算法与逻辑均独立,可以在不同的逻辑实现中调用不同的算法
6. 状态模式
某类中存在某一状态属性对象接口,通过修改该状态对象实现类,使得通过该类某方法中调用该属性对象的某方法达到不同的效果。
与策略模式的区别:
与策略模式最大的区别在于,策略模式通常在创建实例时便已确定算法,但是状态模式的模态对象是时时变化的。并且状态对象中要存在上下文对象,以便在状态执行时个性上下文对象的状态实例。
7. 观察者模式
当某对象某属性发生变化时需要通知其它观察者对象同步修改状态时,使用观察者模式
8. 享元模式
共享对象,当欲创建某一对象时,先查看该对象是否已存在,若存在则直接返回
8个了解应用场景的设计模式
1. 命令者模式
①:将调用者与实施者完全分离,中间通过命令的形式传递
②:命令实现同一接口,调用者与实施者均独立,在增加新的实施者时,只需要增加一个新的命令实现类,以构造方式等参数形式传入调用者
③:注.此处由于实施者与实施者之间相互独立,未实现同一接口,若存在同一接口,则可使用策略模式实现
2. 组合模式
①:将一组继承同一抽象类的实体类,组合成一个整体
②:组合模式适用于对象中包含另一个该抽象类对象的情况
3. 备忘录模式
使用一个容器,保存某对象的备份,当需要备份时,调用该对象中的创建备忘录方法,返回一个备忘录,将该备忘录对象保存到容器中,当需要还原时,从容器中取到备忘录,并以备忘录为角色调用对象的还原方法,将对象还原。
4. 解释器模式
将一连串操作(如1+2*3-4)的每一步操作定义一个解释器实现类,并且每个解释器实现类中存在n个解释器属性对象,通过构造方法的形式对解释器属性对象赋值,在解释器实现的方法中,调用解释器属性对象的实现方法,并对结果进行处理。通常在调用解释器方法时传递一个上下文对象,该对象主要功能为共享不同解释器之间需要的变量及共用的方法
5. 责任链模式
一组实现同一接口的实现类中存在该接口属性,并且在创建对象时传入另一实现类,在实现的方法中调用该属性的该方法,使得不同实现类的该方法一直执行下去 。
6. 访问者模式
将固定的功能封装为元素,将针对不同元素以多态(参数是不同的元素实现类)的形式,创建不同的方法。
为什么不用装饰而用访问者模式:
装饰模式是针对接口做装饰,忽略不同实现类的区别。
为什么不直接通过访问者调用元素,而要经过元素的accept方法调用访问者再次调用元素?
避免因调用时声明的对象类型与实例对象类型不符而调错方法
7. 迭代器模式
①:对存储数据的类,提供一种无需关心数据存在细节,直接获取数据的形式
②:迭代器对象中可取到当前存储数据对象,并记录当前的index,可实现对该数据存储对象的查询,移除等操作
②:所有增强性循环都需要实现Iterable,数组除外
8. 中介者模式
当存在大量同一接口实现类对象,并且彼此间存在复杂的联系时,可通过增加一个中介者的方式简化复杂的逻辑,该中介者对象中存在所有的实现类对象,该模式使得不同对象之间不再直接沟通,而是直接与中介者沟通,而中介者负责与所有的实例沟通。这样的目的是为了简化实现类对象的结构,否则每个实现类中都需要存在大量的其它实例对象。