图解设计模式

  面向对象语言设计中,设计模式可以说是其中的精华了。今天抽出点时间,将设计模式再梳理一下。由于主客观条件限制,理解可能存在一些误差,欢迎有不同意见的朋友相互交流探讨,共同进步。

  设计模式分为三个大类: 结构型,创建型,行为型;

一.创建型设计模式

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).理解:

       实际上就相当于 桥接模式。  不过这里强调的是 行为。 


  剩下的 迭代器模式,解释器模式,备忘录模式,中介者模式,模板模式 就不写了.(模板模式还是比较优雅,接口向子类扩展,如常见的大多数抽象类。)