简介
适配器模式(Adapter Pattern)又叫作变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。
通用模板
-
创建目标角色:也就是我们期望的接口。
java// 期望的接口 public interface ITarget { int requireValue(); }
-
创建源角色:存在于系统中,是指内容满足客户需求(需转换)但接口不匹配的接口实例。
java// 指内容满足客户需求(需转换)但接口不匹配的接口实例。 public class Adaptee { public int currentValue() { return 22000; } }
-
创建适配器:将Adaptee转化为目标角色ITarget的类实例。
java// 适配器 public class Adapter implements ITarget { private Adaptee adaptee; // 构造方法中接收当前接口,可以在适配器中进行转换 public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public int requireValue() { // 把当前的接口转换成想要的接口 return adaptee.currentValue() / 100; } }
模板测试
-
测试代码
javapublic class Client { public static void main(String[] args) { Adapter adapter = new Adapter(new Adaptee()); System.out.println("原来的值为:" + new Adaptee().currentValue()); System.out.println("适配器适配后的值为:" + adapter.requireValue()); } }
-
结果
java原来的值为:22000 适配器适配后的值为:220
应用场景
在生活中,适配器模式有非常多应用场景,例如,电源插转换头、手机充电转换头、显示器转接头等。适配器模式提供一个适配器,将当前系统存在的一个对象转化为客户端能够访问的接口对象。适配器模式适用于以下业务场景。
(1)已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
(2)适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案,有种亡羊补牢的感觉。
适配器模式有3种形式:类适配器、对象适配器、接口适配器。适配器模式一般包含3个角色。
(1)目标角色(ITarget):也就是我们期望的接口。
(2)源角色(Adaptee):存在于系统中,是指内容满足客户需求(需转换)但接口不匹配的接口实例。
(3)适配器(Adapter):将Adaptee转化为目标角色ITarget的类实例。
适配器模式各角色之间的关系如下。 假设在当前系统中,客户端需要访问的是ITarget接口,但ITarget接口没有一个实例符合需求,而Adaptee实例符合需求,但是客户端无法直接使用Adaptee(接口不兼容);因此,需要一个Adapter来进行中转,使Adaptee能转化为ITarget接口的形式。
优点
(1)能提高类的透明性和复用,但现有的类复用不需要改变。
(2)适配器类和原角色类解耦,提高程序的扩展性。
(3)在很多业务场景中符合开闭原则。
缺点
(1)适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
(2)增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
"生搬硬套"实战
场景描述
在我国,220V是标准电压的有效值,它指的是在交流电系统中,有效值的大小。这个电压值广泛应用于家庭和商业用电中,为各种家用电器和商业设备提供电能。例如,电冰箱、空调、电视等家用电器,以及照明、空调、电梯等商业设备都需要220V的电压来正常工作。
然而,220V的电压并不是直接得到的,而是通过变压器将更高电压的电力降低得到的。这里我们就做一个22000V的电压转换为220V的实际案例。
代码开发
-
创建目标角色(这里值220电压的接口)
javapublic interface DC220 { int output220(); }
-
创建源角色(这里指22000电压的类)
java// 当前有的数据源,即要被适配的数据源 public class AC22000 { public int currentValue() { return 22000; } }
-
创建适配器(这里指电压适配器)
java// 电压适配器,把22000电压适配为220 public class PowerAdapter implements DC220{ private AC22000 ac22000; public PowerAdapter(AC22000 ac22000){ this.ac22000 = ac22000; } @Override public int output220() { return ac22000.currentValue() / 100; } }
至此,我们就通过"生搬硬套"适配器模式的模板设计出一套把电压由22000适配为220的适配器,接下来我们进行测试:
-
代码测试
javapublic class Client { public static void main(String[] args) { PowerAdapter powerAdapter = new PowerAdapter(new AC22000()); System.out.println("电压由22000转为:" + powerAdapter.output220()); } }
-
结果
java电压由22000转为:220
总结
适配器模式就是说,当前系统存在两种接口A和B,客户端只支持访问A接口,但是当前系统没有A接口对象,有B接口对象,而客户端无法识别B接口,因此需要通过一个适配器C,将B接口内容转换成A接口,从而使得客户端能够从A接口获取B接口的内容。 在软件开发中,基本上任何问题都可以通过增加一个中间层来解决。适配器模式其实就是一个中间层。综上,适配器模式起着转化/委托的作用,将一种接口转化为另一种符合需求的接口。