白话-23种设计模式7-适配器模式

举报
object 发表于 2022/07/01 16:29:57 2022/07/01
【摘要】 一、白话  适配器模式,最重要的就是适配。将不匹配的两端接起来就是适配。常见的手机充电只能是5V,但是家用是220V,需要充电头适配,将220V转换成5V。手机电压不能改变,出厂就设置好了。家用电压220V,不能改变,统一的。中间的适配器就得到了合理的存在意义,适配了两端,充电头就是适配器。二、定义  将一个接口转换成用户希望的另一个接口就是适配器模式。使得原先无法兼容的接口能一起工作。  ...

一、白话

  适配器模式,最重要的就是适配。将不匹配的两端接起来就是适配。常见的手机充电只能是5V,但是家用是220V,需要充电头适配,将220V转换成5V。手机电压不能改变,出厂就设置好了。家用电压220V,不能改变,统一的。中间的适配器就得到了合理的存在意义,适配了两端,充电头就是适配器

二、定义

  将一个接口转换成用户希望的另一个接口就是适配器模式。使得原先无法兼容的接口能一起工作。

  模式分为:

  1. 类适配器:以类适配,适配器继承被适配类 -- 继承主导,需要重写原先的接口的时候使用
  2. 对象适配器:以对象适配,适配器聚合被适配类 -- 组合主导,使用关联关系代替继承关系,避免了单继承问题,使用更加灵活
  3. 接口适配器:以接口适配,适配器聚合适配接口 -- 实现主导,体现在不需要将接口的所有方法都适配的情况

三、示例

  类适配器

/**
 * 适配器接口角色
 */
public interface IVoltageAdapter {
    public int getPower5V();
}
/**
 * 类适配器,具体适配器角色,通过继承原始接口实现
 */
public class VoltageAdapter extends Power implements IVoltageAdapter {
    @Override
    public int getPower5V() {
        return getPower220V() / 44;
    }
}

  对象适配器

/**
 * 对象适配器,具体适配器角色,使用关联关系代替继承
 */
public class VoltageAdapter2 implements IVoltageAdapter {

    private Power power;

    public VoltageAdapter2(Power power) {
        this.power = power;
    }

    @Override
    public int getPower5V() {
        return power.getPower220V() / 44;
    }
}

  接口适配器

/**
 * 适配器接口角色
 */
public interface IVoltageAdapter2 {
    public int getPower5V();
    public int getPower10V();
    public int getPower20V();
    public int getPower220V();
}
/**
 * 接口适配器,具体适配器角色,抽象类,实现所有方法
 */
public abstract class AbstractAdapter implements IVoltageAdapter2 {
    public int getPower5V(){
        return 0;
    }
    public int getPower10V(){
        return 0;
    }
    public int getPower20V(){
        return 0;
    }

    public int getPower220V(){
        return 0;
    }
}
/**
 * 接口适配器,具体适配器角色,只实现必要的接口,其余接口不用实现
 */
public class VoltageAdapter3 extends AbstractAdapter {
    public int getPower5V(){
        return 5;
    }
}

输出示例

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 类适配-客户需要5V电压
        VoltageAdapter voltageAdapter = new VoltageAdapter();
        int result = voltageAdapter.getPower5V();
        System.out.println("result = " + result);

        // 对象适配-客户需要5V电压
        VoltageAdapter2 voltageAdapter2 = new VoltageAdapter2(new Power());
        int result2 = voltageAdapter2.getPower5V();
        System.out.println("result2 = " + result2);

        // 接口适配-客户需要5V电压
        VoltageAdapter3 voltageAdapter3 = new VoltageAdapter3();
        int result3 = voltageAdapter3.getPower5V();
        System.out.println("result3 = " + result3);
    }
}

四、总结

  对软件系统中,如果要复用以前的现存对象但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口,来供我们调用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。