设计模式之适配器模式(Adapter Design Pattern)

适配器模式是八种结构型模式之一,适配器是接口转换器,为需要在一起工作但不兼容的两个接口桥梁。

适配器是常用的设计模式之一,现在是互联网时代,很多应用程序都会调用第三方的接口,比如支付接口、短信接口、验证码接口、数据对象存储接口等。而这些接口都是不一样的,如果在应用中要调用多种接口完成相同功能,就需要适配器。比如短信接口,提供短信服务的第三方供应商很多,如果每次更换供应商都要修改调用代码,就违反了开闭原则。如果改用适配器模式,通过工厂模式根据参数创建不同的适配器,我们只需要简单的修改工厂类,就可以新增一个新供应商的短信服务。

适配器在生活中也很常见,如果手机充电器,笔记本充电器,都是电源适配器。在中国所使用的是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完全符合。

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值