设计模式对比篇

来源:互联网 发布:head first java 烂 编辑:程序博客网 时间:2024/05/29 14:07

对比篇

关于设计模式,有时你会发现有些设计模式的类图是有些相似的但也不完全相同,但是功能却不相同,这时我便常用对比的方式让自己更熟练的掌握这些设计模式。

续前4篇

设计模式初篇
设计模式精髓篇之创建型
设计模式精髓篇之结构型
设计模式精髓篇之行为型

抽象工厂和建造者模式的对比

类图:


(此处图片摘自网络)

描述

抽象工厂:为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类。
建造者模式:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程能创建出不同的表示。

差异

,两种设计模式目的都是将一个要创建的复杂对象进行拆分出去,并且都是将具体的实现交给子类,父类不直接创建实现。
抽象工厂要拆分的是一个工厂或者说系统内的不同子系统对象,而子系统还是一个相对复杂的系统对象,其中系统中子系统对象之间是相对整体独立的,而子系统间的对象是整体与部分的关系,这点类似于建造者模式。建造者模式要拆分的是一个复杂的整体对象,拆分一个待实现的子部分,并且具体的子部分交由具体的Builder者去实现。可以理解为代理的方式,将对象的子部分代理给Builder者去实现。也可以理解为模板模式,由父类创建好算法结构,具体的算法实现交由Builder接口去实现。
使用偏好建造者模式常用在要创建一个由依赖的部分组成的整体的复杂对象,具体的创建过程交由Builder(接口或者说代理者)去实现。抽象工厂常用在创建独立的多个整体对象,每个整体对象又是抽象的,具体实现又交由子类去具体创建。

JDK中使用参考及详细描述:建造者模式 AND 抽象工厂

装饰模式和适配器模式的对比

类图:


(此处图片摘自网络)

描述

装饰模式:动态的给一个对象添加额外的职责,比使用生成子类来添加对象功能更加灵活。
适配器模式:将一个的接口转换成使需要的另外一种接口,从而使原本因接口不匹配的两个类能一块工作。

差异

同,两种设计模式都是使用接口的方式给对象添加功能。
异,从定义上理解,装饰模式,是以扩展的方式给对象动态添加功能。而适配器模式,是在原对象的已有功能的基础上,就某个具体功能加以修改形成新的功能。从设计方式上看,装饰模式,是通过实现同一个接口,通过类对象间关联的方式,装饰者给被装饰者添加功能。而适配器模式,对象是在两个接口之间,通过实现target接口来达到转换原有功能。
使用偏好,装饰模式,需要扩展一个类的功能或者给你个类增加附加责任;需要动态的给一个对象增加功能,这些功能可以再动态的撤销;需要增加有一些基本功能的排列组合而产生非常大量的功能,从而使得继承关系变得不现实。适配器模式,系统需要使用现有的类,但此类已经不符合系统的需要;想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的的类一起工作。适配器模式在系统升级的时候使用的频率很高,对旧系统的一些功能方法在新系统中引用。

JDK中使用参考及详细描述: 装饰模式 AND 适配器模式

装饰模式和代理模式的对比

类图:


(此处图片摘自网络)

描述

装饰模式:动态的给一个对象添加额外的职责,比使用生成子类来添加对象功能更加灵活。
代理模式:为其他对象通过一种代理以控制对这个对象的访问。

差异

同,模式的设计方式相同,模式中的两大角色都实现同一个接口,并且都是其中一个角色对象关联到另外一个角色对象上,进而实现相应的操作。装饰模式,装饰者角色对象关联被装饰者角色对象,从而在被装饰者对象上动态添加功能。代理模式,代理角色对象关联被代理角色对象,从而控制其他对象访问被代理对象。
异,目的不同,装饰模式,是以给被装饰者添加功能为目的。代理模式,是以控制其他对象访问被代理对象为目的。实现方式不同,装饰模式,往往在关联的被装饰者对象上添加额外的处理代码(功能性)代码,代理模式,往往在被关联的被代理者对象上添加条件控制性代码,当然如果是面向切面编程的时候另说。
使用偏好,代理模式,常用在访问一个类时做一些控制。
装饰模式,常用在不想增加很多子类的情况下扩展类。

JDK中使用参考及详细描述:装饰者模式 AND 代理模式

命令模式和访问者模式的对比

类图:


(此处图片摘自网络)

描述:

命令模式:对一个请求或命令的封装在命令对象中,从而对请求者和操作者进行解耦,通过使用不同的请求把操作者参数化,也可以对请求做一下相关处理,请求排队,记录日志,撤销和恢复等操作。
访问者模式:封装一下作用于某种数据结构中各元素的操作,可以在不改变数据结构的情况下定义作用于这些数据结构元素的新的操作。

差异

同,两种设计模式都是对操作来进行封装因为两种模式中的操作都是多变可生成多种的。命令模式,封装的是请求操作。访问者模式,封装的是对某个数据结构的操作。
异,设计思想的不同,命令模式,重点是为了对命令请求者和命令接受者两种角色间的解耦,对于命令接受者,能对请求进行参数化操作,请求排队,撤销或恢复的操作。访问者模式,重点是在操作接受者(数据结构元素)和对数据结构元素的新操作的添加和定义上。
使用偏好,命令模式,常用在要对行为操作进行”记录、撤销/重做、事务”等处理,并且需要对抵御变化的紧耦合,能实现”行为请求者”与”行为实现者”的解耦。访问者模式,需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作”污染”(不改变该对象的数据结构)这些对象的类。

JDK中使用参考及详细描述:命令模式 AND 访问者模式

感想

**从模式中来,到模式中去**“从模式中来”,主要是在JDK中学习三大类设计模式,和对比模式之间的同异来熟练掌握设计模式。“到模式中去”,主要是通过熟练掌握设计模式,能思索出一套属于自己的设计模式,也开始能领悟出一套自己的编程技巧和编程习惯的方式。
原创粉丝点击