一 概述
适配器模式,装饰模式,代理模式,这三种模式都有着一些大同小异的地方,有必要详细说明下三者的区别。
设计模式,其实是一种解决方法,JAVA 作为一种面向对象的语言,对于所有的设计模式在实现上,总是少不了对接口的实现,对抽象类的继承,有时候似乎是为了去实现接口而去写接口,所以在这三种模式的说明代码中,我们都定义了接口这些东西,所以才有了现在的混淆。
二 三种设计模式的概念
适配器模式:一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。
就如同一个三孔转2孔的适配器一样,他有三孔的插头,可以插到三孔插座里,又有两孔的插座可以被2孔插头插入。适配器模式是在于对原有3孔的改造。
在使用适配器模式的时候,我们必须同时持有原对象,适配对象,目标对象。。。
装饰模式:原有的不能满足现有的需求,对原有的进行增强。
装饰器模式特点在于增强,他的特点是被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。
代理模式:同一个类而去调用另一个类的方法,不对这个方法进行直接操作。
代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。
总的来说就是如下三句话:
- 适配器模式是将一个类 (a) 通过某种方式转换成另一个类 (b)
- 装饰模式是在一个原有类 (a) 的基础之上增加了某些新的功能变成另一个类 (b)
- 代理模式是将一个类 (a) 转换成具体的操作类 (b)
三 实例分析
3.1 适配器模式
比如现在公司有一个 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 {
@Override
public void updateDate(String orderId, String date,
String client) {
System.out.println(client+"已将订单"+
orderId + "的有效期延长至" + date);
}
}
在这套代码中,对于客户端来说需要传入 orderId 和有效期 date 和客户端名字才能延长。。。
Main 方法: