适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。

但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。

今天再重新学习下,把学习心得分享给大家一下。这次是结合的我工作中的实际项目。

设计模式,其实是一种解决方法,JAVA作为一种面向对象的语言,对于所有的设计模式在实现上,总是少不了对接口的实现,对抽象类的继承,有时候似乎是为了去实现接口而去写接口,所以在这三种模式的说明代码中,我们都定义了接口这些东西,所以才有了现在的混淆。

先不厌其烦的介绍下这三种的设计模式的概念吧。

适配器模式,一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

装饰器模式,原有的不能满足现有的需求,对原有的进行增强。

代理模式,同一个类而去调用另一个类的方法,不对这个方法进行直接操作。

适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。

就如同一个三孔转2孔的适配器一样,他有三孔的插头,可以插到三孔插座里,又有两孔的插座可以被2孔插头插入。

适配器模式是在于对原有3孔的改造。

在使用适配器模式的时候,我们必须同时持有原对象,适配对象,目标对象。。。。

装饰器模式特点在于增强,他的特点是被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。

代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。

总的来说就是如下三句话:

1 适配器模式是将一个类(a)通过某种方式转换成另一个类(b).2 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b).3 代理模式是将一个类(a)转换成具体的操作类(b).

又是罗里吧嗦一大段话,然后我们开心的来到了举例时间,这次举的是工作中实际的例子。

先简单介绍一下,公司有一个ORDER系统,专门用于提供订单管理的接口,提供给O2O商城,WAP商城,手机类APP,微信等客户端调用。

ORDER系统在上线之时,已经包含了非常完整的数据操作。

现手机类APP需要升级,老的接口可能不能满足需求,如原O2O订单提货延长有效期接口需要提供截至时间和订单号,新APP可能不提供截至时间,只需要 提供订单号即可延长时间。

而老的接口又不能修改,因为老的order接口是针对所有平台的,那么必须将新接口要求与原接口进行适配。。。

解决方案如下:新增AppAdepter类,用来适配老的接口,同时开发给新的接口。。。。

先给出原接口和实现类

原接口:

/** * 原接口,需要传入orderId,时间 * */public interface SourceOrderApi {public void updateDate(String orderId,String date,String client);}

实现类:

public class SourceOrderApiImpl implements SourceOrderApi{@Overridepublic void updateDate(String orderId, String date, String client) {System.out.println(client+"已将订单"+orderId+"的有效期延长至"+date);}}

在这套代码中,对于客户端来说需要传入orderId 和 有效期date 和客户端名字才能延长。。。

Main方法:

public class Test {public static void main(String[] args) {SourceOrderApi sourceOrderApi = new SourceOrderApiImpl();sourceOrderApi.updateDate("123456", "2014-10-15", "user");}}运行结果:

而对于新的接口,客户端则不必去传入date 参数

public interface AppOrderApi {//只需要传入订单Id即可public void updateDate(String orderId,String client);}新的实现类:public class AppOrderApiImpl implements AppOrderApi{SourceOrderApi sourceOrderApi;public AppOrderApiImpl(){sourceOrderApi = new SourceOrderApiImpl();}@Overridepublic void updateDate(String orderId,String client) {//这里适配的方式随意,但是保证是要完全兼容原有的,就是保证调用原有的接口sourceOrderApi.updateDate(orderId, "9999-12-31",client);}}

main方法:

public class Test {public static void main(String[] args) {AppOrderApi appOrderApi = new AppOrderApiImpl();appOrderApi.updateDate("123456", "user");}}

运行结果:

在这套代码中,新的实现类持有了老接口的对象,就是把这个对象new 出来。。。

然后在新的方法里,进行适配操作。

而这里所谓的适配就是兼容老接口和兼容新接口。

兼容老接口非常简单,就是直接调用老的方法即可。

而兼容新接口就是你所要去做的业务逻辑。。。

比如我这里做了比较简单的操作,app类的统一传入“9999-12-31”,这些都是根据具体的项目需求去实现你的业务代码。

看到这,很多人会觉得 这样的代码是不是很常见。。。。

我自己都特意去翻了一下我之前的代码,很多类似的写法。。。

其实设计模式很多时候都融入到我们的代码中,只是我们没有去理解这种模式,所以就算你自己写出来了,都不知道这是一种适配器模式。。。

设计模式是一种思想,他没有固定的实现代码,我大量查阅了很多大神的的适配器模式解释,大家都不约而同的提到了类的适配和对象的适配,代码中有实现继承这样的写法。当然了,这些大神的写法都是比较标准的。。。

但是仔细再回看下GOF的适配器模式解释。

没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,

适配器模式,装饰模式,代理模式异同

相关文章:

你感兴趣的文章:

标签云: