一、模式解析
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如果使用新接口可能导致原来大面积的修改,那么可以考虑使用适配器模式将新的接口适配旧接口。
适配器接口比较简单,而且适配一词现实中用的也比较多,如电源适配器,都是一个道理,所以直接上代码
二、模式代码
1、原有接口
package adapter.patten; public interface Target { public void request(); }
2、新的方法
package adapter.patten; public class Adaptee { public void specificRequest(){ System.out.println("我正在执行specific 方法"); } }
3、适配器
package adapter.patten; public class Adapter implements Target { public Adaptee adaptee; public void request(){ adaptee=new Adaptee(); adaptee.specificRequest(); } }
4、客户端代码
package adapter.patten; public class Client { public static void main(String[] args) { Target target=new Adapter(); target.request(); } }
5、执行结果
我正在执行specific 方法
三、应用场景
在工作中遇到平台需要使用支付平台进行支付,可能存在情况是原来平台已经接入了支付宝支付,各种接口包括:支付、退货、查询、对账都已经开发完成,突然客户说想改为财付通支付方式,那么已经写好的代码均需要变化,此时就需要使用适配器进行转化。
四、场景代码
1、定义支付方式,调用此接口,可以完成支付
package adapter.example; public interface IPay { public void pay(); }
2、支付宝支付流程编写
package adapter.example; public class AliPay implements IPay { @Override public void pay() { System.out.println("通过支付宝进行支付"); } }
3、财付通提供的支付方式,接口与已经定义的不同
package adapter.example; public class TenPay { public void tenPay(){ System.out.println("通过财付通进行支付"); } }
4、编写适配器,进行转化
package adapter.example; public class TenPayAdapter implements IPay { TenPay tenPay; @Override public void pay() { if(tenPay==null){ tenPay=new TenPay(); } tenPay.tenPay(); } }
5、客户端调用
package adapter.example; public class Client { public static void main(String[] args) { // IPay pay=new AliPay(); IPay pay=new TenPayAdapter(); pay.pay(); } }
五、说明
1、适配器模式是当两种接口无法兼容的情况下采取的被动方式,如果可以通过设计,避免出现此种情况,那么应尽量少使用适配器模式
2、适配器模式可以完成对象的延迟创建,如TenPayAdapter 中,直到支付方法被调用,才生成TenPay的实例