图解设计模式
面向对象语言设计中,设计模式可以说是其中的精华了。今天抽出点时间,将设计模式再梳理一下。由于主客观条件限制,理解可能存在一些误差,欢迎有不同意见的朋友相互交流探讨,共同进步。
设计模式分为三个大类: 结构型,创建型,行为型;
一.创建型设计模式
1.理解:
我对创建型设计模式理解是: 对象的生成方式。
2.创建型之 工厂模式:
1).图解
2).理解:
核心是: 抽象产品,以及 产品获取规则。
在工厂模式下加入泛型,使得代码复用性 更高; -> 抽象工厂模式
场景 | 使用前 | 使用后 |
用户从使用产品B 换成使用产品C |
1.暂停进程; 2.将new B() 改成 new C(); 3.启动进程; |
1.调用工厂方法,传入相应的产品参数; |
3.创建型之单例模式:
1).图解
2).理解:
核心是: 构造方法的私有化; 另要处理 多线程的安全性问题;我觉得单例主要是针对多线程而言;
对象的本质是资源,资源的本质是状态集。线程的操作单位为栈,类的定义在常量区,对象的保存地址为堆;跨线程操作对象需要定义final常量,并且会带来代码结构上的高耦合;
当线程A操作了一个类对象时,该对象的状态已经发生了改变。线程B需要在线程A已经修改的状态下进行操作,则需要使用单例模式;
4.创建型之原型模式:
1).图解:
2).理解:
对象的本质是资源,资源的本质是状态集;
从类生成对象,需要对相应的状态进行同步;原型模式则相当于直接拷贝源对象生成新对象;
核心实现: 加入一个以自身为参数的构造函数;
5.创建型之建造器模式:
1).图解:
2).理解:
核心是对 方法进行修饰,返回本身(指的是 构造器);
使得创建对象的代码更加优雅,实现链式调用的方式;
二.结构型设计模式:
1.理解:
结构型设计模式侧重结构,所谓结构,也就是类的结构;
2.结构型设计模式之 代理模式:
1).图解:
2).理解:
其实很多的代码都有代理的影子;但是代理模式之所以作为一个结构型设计模式单独存在,其核心在于接口。
当然了,这在java里面属于静态代理。动态代理的话,其结构方面的影子倒是少了很多。 从这个意义上来说,动态代理倒不像是结构型设计模式了,因为其灵活性大大提高。 我想这也是 面向切面编程 的精神所在吧。
3.结构型设计模式之 适配器模式:
1).图解:
2).理解:
本质上是代理模式的变种;
核心在于,公共接口的部分功能有所变动;(注意,不是新增功能);
4.结构型设计模式之 享元模式:
1).图解:
2).理解:
我的理解是: 单例+工厂模式;
至于为什么给划分到结构型设计模式,我想侧重的是类的水平扩充吧。
5.结构型设计模式之 外观模式:
1).图解:
2).理解:
隐隐也能从中感觉出是 代理模式;
我觉得被划分到 结构型设计模式,主要原因在于 实体类之间的关系过于复杂吧,为了屏蔽细节。 注意,这个细节是关于类的细节。
6.结构型设计模式之 装饰器模式:
1).图解:
2).理解:
还是 代理模式的一类变种, 实际上对子类具有耦合性。 我想适用于类型没有大的变动的场景吧。
7.结构型设计模式之 桥接模式:
1).图解:
2).理解:
顶层设计之间的相互依赖。
最终的落脚点在于 具体动作的实现。
3.行为型设计模式:
1.理解:
所谓行为型,我认为就是侧重点在于关注 代码流程吧,完成目标程序所完成的一组行为。
对于 行为,我认为最直接的理解在于: 程序执行代码的走向。
我们知道,最早的图灵机模型,就是一条纸带由进到出,这便是一个行为了。 如今处于多线程时代,会给这个流程带来很多的变数,但是流程总体是不变的。
2.行为型设计模式 之 观察者模式:
1).图解:
2).理解:
核心在于 : 观察者集是动态的。
单线程情况下,实际上是一种优雅的动态插入代码段方式;
其行为的逻辑层次是水平的。
多线程情况下,实际上就相当于一个系统了。如应用方面的tomcat,springBoot,乃至操作系统的中断,都有观察者模式的影子。
3.行为型设计模式之 责任链模式:
1).图解:
2).理解:
核心在于子类代理了父类;
其行为模式为深度调用。 单线程下也能实现优雅的增加代码段。
停止条件为 父类代理为空。
servlet标准里的过滤器,本质上也该是这样的形式,应该是单向的。 但是它给人的形式倒像是栈调用。其原因在于,过滤方法完了之后,会返回过滤结果。线程调用栈 会有一个过滤结果的出栈过程,该过程是一个逆向的过程。 因此,其表现出来是双向的。
4.行为型设计模式之 策略模式:
1).图解:
2).理解:
其核心在于 模板类,模板类提供一些不变的方法,依赖抽象业务类进行实现。
这种结构就用的太多了。 没想到它竟然是策略模式。 惊讶。
5.行为型设计模式之 状态模式:
1).图解:
2).理解:
我的理解是: 观察者模式 加入一个回调接口。 每次响应了通知之后,将状态进行变换。
状态的变化路径是已知的。
对比着状态机去理解。
6.行为型设计模式之 命令模式:
1).图解:
2).理解:
接收者相当于 资源,线程句柄;
命令相当于 事件,事件类型;
执行器相当于 虚拟机,cpu;
执行器执行的是命令,命令根据接收者不同而不同。 实际上相当于策略模式了。
7.行为型设计模式之 访问者模式:
1).图解:
2).理解:
实际上就相当于 桥接模式。 不过这里强调的是 行为。
剩下的 迭代器模式,解释器模式,备忘录模式,中介者模式,模板模式 就不写了.(模板模式还是比较优雅,接口向子类扩展,如常见的大多数抽象类。)