Only老K说-Java设计模式之适配器模式

适配器

什么是适配器?一图了解
在这里插入图片描述
适配器分类

类适配器模式
Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配。
对象适配器模式
将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination  类接口,完成source->Destination 的适配
接口适配器模式
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求

适配器模式分类三种体现形式思想都大同小异,这里就只介绍最常用的 对象适配器模式;

案例(没有使用设计模式)

package com.onlyk.design.adapter.before;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:10
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 * 对比图上的220V电压
 */
public class Voltage220V {
    private double voltage;
    public Voltage220V() {
        this.voltage = 220;
    }
    public double getVoltage() {
        return voltage;
    }
    public void setVoltage(double voltage) {
        this.voltage = voltage;
    }
}


package com.onlyk.design.adapter.before;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:12
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public class Phone {
    //   充电
    public void charge(Voltage220V voltage220V){
        double voltage = voltage220V.getVoltage() / 40;
        System.out.println("最终手机充电所用电压:" + voltage + "V");
    }
}


package com.onlyk.design.adapter.before;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:14
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
//       已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//       还一种方案:新增5V的一个Voltage5V,Voltage的电压可以被手机使用
//       但是这违背现实生活现象,现实生活中只有220V的电源,其他的电源都是通过适配得来的
        phone.charge(new Voltage220V());
    }
}

案例(使用设计模式)

package com.onlyk.design.adapter.after;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:22
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public class Voltage220V {
    private double voltage;
    public Voltage220V() {
        this.voltage = 220;
    }
    public double getVoltage() {
        return voltage;
    }
    public void setVoltage(double voltage) {
        this.voltage = voltage;
    }
}


package com.onlyk.design.adapter.after;
/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:24
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public interface Voltage5V {
    double getVoltage();
}
class VoltageAdapter implements Voltage5V{
    private Voltage220V voltage220V;
    public VoltageAdapter(Voltage220V voltage220V){
        this.voltage220V=voltage220V;
    }
    @Override
    public double getVoltage() {
        return voltage220V.getVoltage()/40;
    }
}


package com.onlyk.design.adapter.after;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:27
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public class Phone {
    //   充电
    public void charge(Voltage5V voltage5V){
        double voltage = voltage5V.getVoltage();
        System.out.println("最终手机充电所用电压:" + voltage + "V");
    }
}

package com.onlyk.design.adapter.after;

/**
 * @author only老K 我为自己代言
 * @create 2020-03-20 17:28
 * @blogaddress https://blog.youkuaiyun.com/weixin_44255950
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
//       已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//       VoltageAdapter适配器对Voltage220V这个不能直接使用的电源适配后就可以使用了
        phone.charge(new VoltageAdapter(new Voltage220V()));
    }
}

结果虽然都是一样的,而且使用适配器设计模式代码更加复杂,但是对比来说,使用了适配器设计模式代码之间耦合性更加低(也更加符合设计模式的核心思想:拥抱变化)

dapter 模式最大的作用还是将原本不兼容的接口融合在一起工作

结论:
适配器模式有两种,我们需要根据实际情况来使用,在实际情况之中,我们可能使用一些已经封装好的代码,有的时候需要对其进行稍微的修改,可是这些代码同时被其他组件所使用,我们不能在原来的程序上改动,因此通过适配器模式,我们将这些代码进行进一步的处理,然后再使用,这样的设计方法是非常好的,因为我们保证了在不修改原来的代码的情况下实现了代码的复用和个性化。一般用在系统升级的时候,需要保证兼容性,我们将新系统作为被适配对象,通过自己定义的适配器保证在旧系统上依旧可以使用之前的功能,保证了兼容性。也用在使用别人的代码的时候。但是如果被适配的角色的功能和最终我们使用的功能完全不同时,适配器是不能使用的,不能将电流适配成水流的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值