适配器模式又叫作变压器模式,它的功能是将一个类的接口变成客户端所期望的另一个接口,从而使原本因接口不匹配而导致
无法在一起工作的两个类能够一起工作,属于结构型设计模式。
在软件开发过程中,基本上任何问题都可以通过增加一个中间层来解决。适配器模式其实就是一个中间层。适配器模式起着转化
/委托的作用,将一种接口转化为另一种符合需要的接口。
适配器模式有三种形式:类适配器、对象适配器、接口适配器。适配器模式一般包含三个角色:
类适配器的原理就是通过继承来实现适配器功能。具体做法就是Adapter继承Adaptee并实现ITarget接口,这样Adapter就具备了Adaptee和ITarget的特性,可以将
两者进行转化,其UML类图如下:
我们用一个例子来进行讲解。在中国,民用电都是220V交流电,但用手机使用的锂电池使用的是5V的直流电。因此,当手机充电时,需要使用电源适配器来进行转换,
我们用代码来还原这个场景,首先创建Adaptee角色类,需要被转换的对象AC220,表示220V交流电。
public class AC220 { public int outputAC220V(){ int output = 220; System.out.println("输出电压" + output + "V"); return output; } }
创建ITarget角色DC5接口,表示5V直流电。
public interface DC5 { int output5V(); }
创建Adapter角色的电源适配器PowerAdapter类。
public class PowerAdapter extends AC220 implements DC5 { public int output5V() { int adapterInput = super.outputAC220V(); int adapterOutput = adapterInput / 44; System.out.println("使用Adapter输入AC" + adapterInput + "V,输出DC" + adapterOutput + "V"); return adapterOutput; } }
测试代码。
public class Test { public static void main(String[] args) { DC5 adapter = new PowerAdapter(); adapter.output5V(); } }
对象适配器的原理就是通过组合来实现适配器的功能。具体做法是,首先让Adapter实现ITarget接口,然后内部持有Adaptee实例。这样做使得代码更加灵活,比如
我们需要将两个不同的源角色(Adaptee)整合成一个ITarget目标角色,显然这个时候用继承就没办法实现了,所以这也是为什么我们要多用组合少用继承的原因。其UML
类图如下:
接前面的示例,代码只需要更改Adapter实现,及去掉继承Adaptee类,并将Adaptee作为内部属性注入,其他与类适配器一致。
public class PowerAdapter implements DC5 { private AC220 ac220; public PowerAdapter(AC220 ac220) { this.ac220 = ac220; } public int output5V() { int adapterInput = ac220.outputAC220V(); int adapterOutput = adapterInput / 44; System.out.println("使用Adapter输入AC" + adapterInput + "V,输出DC" + adapterOutput + "V"); return adapterOutput; } }
接口适配器的关注点和前面两个适配器不太一样,当我们的源角色和目标角色的接口能够匹配的情况下,但是我们的目标角色可能包含多个源角色的功能,
也就是有其他的除了源角色对应抽象方法以外的抽象方法,这样如果我们目标角色之间实现源角色接口的话,会多出许多空的实现方法,显得臃肿。此时就需要
使用接口适配器来实现了,接口适配器的UML类图以及写法都和对象适配器的完全一样,唯一的区别是,在目标角色接口中多了几个抽象方法,然后在适配器角
色中多了抽象方法对应的源角色属性注入。所以这里就不再列举了。
原文:https://www.cnblogs.com/liu-yi/p/13977737.html