适配器模式是八种结构型模式之一,适配器是接口转换器,为需要在一起工作但不兼容的两个接口桥梁。
适配器是常用的设计模式之一,现在是互联网时代,很多应用程序都会调用第三方的接口,比如支付接口、短信接口、验证码接口、数据对象存储接口等。而这些接口都是不一样的,如果在应用中要调用多种接口完成相同功能,就需要适配器。比如短信接口,提供短信服务的第三方供应商很多,如果每次更换供应商都要修改调用代码,就违反了开闭原则。如果改用适配器模式,通过工厂模式根据参数创建不同的适配器,我们只需要简单的修改工厂类,就可以新增一个新供应商的短信服务。
适配器在生活中也很常见,如果手机充电器,笔记本充电器,都是电源适配器。在中国所使用的是220伏的电源电压,美国等国外有的使用110V电源电压,而普遍的电子产品一般所需的电源电压为5伏至20伏左右。如果没有电源适配器,这些电子产品都会因为无法充电而无法使用。
下面用代码模拟电源适配器,体验适配器模式。
现实中先是电接入插座,插座与电源(线)连接,电源(线)再把电导入电子产品
代码模拟
//电
public class Electricity {
//电压
private int voltage;
public Electricity(int voltage){
this.voltage = voltage;
}
public int getVoltage() {
return voltage;
}
}
//插座接口
public interface Socket {
public Electricity out();
}
//插座
public class SocketImpl implements Socket{
Electricity electricity;
public SocketImpl(Electricity electricity){
this.electricity = electricity;
}
@Override
public Electricity out() {
return electricity;
}
}
//电源接口
public interface PowerSupply {
//输出电
public Electricity out();
}
//电源
public class PowerSupplyImpl implements PowerSupply{
private Socket socket;
public PowerSupplyImpl(Socket socket){
this.socket = socket;
}
@Override
public Electricity out() {
return this.socket.out();
}
}
//笔记本电脑
public class Laptop {
Electricity electricity;
//充电接口
public void batteryCharging(PowerSupply powerSupply){
Electricity out = powerSupply.out();
if(out.getVoltage()>20)
throw new OverVoltageException("The voltage is too high");
electricity = out;
System.out.println("笔记本电脑充电成功");
}
}
//手机
public class Mobile {
Electricity electricity;
//充电接口
public void batteryCharging(PowerSupply powerSupply){
Electricity out = powerSupply.out();
if(out.getVoltage()>5)
throw new OverVoltageException("The voltage is too high");
electricity = out;
System.out.println("手机充电成功");
}
}
public class Demo {
public static void main(String[] args) {
Electricity electricity = new Electricity(220);
Socket socket = new SocketImpl(electricity);
PowerSupply powerSupply = new PowerSupplyImpl(socket);
Mobile mobile = new Mobile();
mobile.batteryCharging(powerSupply);
powerSupply = new PowerSupplyImpl(socket);
Laptop laptop = new Laptop();
laptop.batteryCharging(powerSupply);
}
}
//执行结果
Exception in thread "main" com.swy.adapter.OverVoltageException: The voltage is too high
at com.swy.adapter.Mobile.batteryCharging(Mobile.java:10)
at com.swy.adapter.Demo.main(Demo.java:10)
这里的电源(线)没有使用适配器,家用电直接接入了电子产品,导致电压过高异常com.swy.adapter.OverVoltageException: The voltage is too high;
使用过电子产品的人都知道,充电电源都会连接一个适配器,通过适配器转换电压。
\\上面的代码加入适配器
//电源适配器
public interface PowerSupplyAdapter extends PowerSupply {
//转换电压
public void conversion(Electricity electricity);
}
//笔记本电脑适配器
public class LaptopPowerSupplyAdapter implements PowerSupplyAdapter{
private Socket socket;
LaptopPowerSupplyAdapter(Socket socket){
this.socket = socket;
}
@Override
public Electricity out() {
Electricity electricity = this.socket.out();
conversion(electricity);
return electricity;
}
@Override
public void conversion(Electricity electricity) {
//笔记本电脑充电电压一般只要20V,电压转为20V
electricity.conversion(20);
}
}
//手机电脑适配器
public class MobilePowerSupplyAdapter implements PowerSupplyAdapter{
private Socket socket;
MobilePowerSupplyAdapter(Socket socket){
this.socket = socket;
}
@Override
public Electricity out() {
Electricity electricity = this.socket.out();
conversion(electricity);
return electricity;
}
@Override
public void conversion(Electricity electricity) {
//手机充电电压一般只要5V,电压转为5V
electricity.conversion(5);
}
}
//电,加入可转换功能
public class Electricity {
//电压
private int voltage;
public Electricity(int voltage){
this.voltage = voltage;
}
public int getVoltage() {
return voltage;
}
//转换电压
@Override
public void conversion(int voltage) {
this.voltage = voltage;
}
}
public class Demo {
public static void main(String[] args) {
Electricity electricity = new Electricity(220);
Socket socket = new SocketImpl(electricity);
PowerSupply powerSupply = new MobilePowerSupplyAdapter(socket);
Mobile mobile = new Mobile();
mobile.batteryCharging(powerSupply);
powerSupply = new LaptopPowerSupplyAdapter(socket);
Laptop laptop = new Laptop();
laptop.batteryCharging(powerSupply);
}
}
//执行结果
手机充电成功
笔记本电脑充电成功
看到这里不知道你看明白了没有。让我们再回到适配器模式的定义,适配器是接口转换器,为需要在一起工作但不兼容的两个接口桥梁。
上面例子电子产品需要的是电源(PowerSupply)接口,家用电源提供的是插座(Socket)接口。通过PowerSupplyImpl、LaptopPowerSupplyAdapter、MobilePowerSupplyAdapter 三个类把Socket转换成了PowerSupply。可以说这三个类都满足了适配器模式的定义,都算的上是适配器。为什么不把PowerSupplyImpl命名为适配器。因为例子是要适配具体的电子产品,所以PowerSupplyImpl并不适用,如果适配家用电器则PowerSupplyImpl完全符合。