【设计模式-3.2】结构型——适配器模式

说明:本文介绍设计模式中结构型设计模式中的,适配器模式;

插头转换器

适配器模式属于结构型设计模式,设计思想体现在结构上的。以插头转换器为例,当你需要给手机充电,但是眼前只有一个三孔插座,二脚充电器无法使用三孔插座。

这时如果有一个插头转换器,可以将二孔插头转为三脚插头,就可以解决眼前问题。这个转换器扮演的就是适配器的角色。如下:

(TwoPin,二脚插座接口,只提供二脚插头充电)

/**
 * 二脚插座
 */
public interface TwoPin {
   

    /**
     * 二脚充电
     */
    public void charge(int l, int r);
}

(ThreePin,三脚插座接口,只提供三脚插头充电)

/**
 * 三脚插座
 */
public interface ThreePin {
   

        /**
        * 三脚充电
        */
        public void charge(int l, int r, int g);
}

(Phone,手机,充电器属于二脚插头)

/**
 * 手机
 */
public class Phone implements TwoPin{
   

    @Override
    public void charge(int l, int r) {
   
        System.out.println("手机充电中..." + l + "====" + r);
    }
}

(客户端类,演示手机充电过程,二孔插头无法插入三孔插座,类型错误)

在这里插入图片描述

为了解决上面问题,我们可以创建一个适配器类,用来适配手机类使用三孔插座,如下:

/**
 * 适配器
 */
public class Adapter implements ThreePin{
   

    /**
     * 适配器持有手机对象
     */
    private Phone phone;

    /**
     * 适配手机使用三脚插座
     * @param l
     * @param r
     * @param g
     */
    @Override
    public void charge(int l, int r, int g) {
   
        phone.charge(l, r);
    }
}

(Client,客户端,演示手机使用三脚插座)

/**
 * 客户端
 */
public class Client {
   
    public static void main(String[] args) {
   
        // 借助适配器,手机使用三脚插座充电
        Phone phone = new Phone();
        new Adapter(phone).charge(1, 1, 0);
    }
}

借助适配器,手机就可以使用三脚插座了;

在这里插入图片描述

专属适配器

当我们想让该适配器专属于手机,而不给其他类使用时,我们可以通过继承的方式来实现。

如下:

(Phone,手机类,给手机一个name属性,表示手机的名称)

/**
 * 手机
 */
public class Phone implements TwoPin{
   

    /**
     * 手机名称
     */
    protected String name;

    public Phone(String name) {
   
        this.name = name;
    }

    @Override
    public void charge(int l, int r) {
   
        System.out.println(name + ":手机充电中..." + l + "====" + r);
    }
}

(PhoneAdapter,手机专属适配器,继承于手机,实现三脚插座接口)

/**
 * 手机专属适配器
 */
public class PhoneAdapter extends Phone implements ThreePin{
   

    /**
     * 适配器持有手机对象
     */
    private Phone phone;

    public PhoneAdapter(Phone phone) {
   
        super(phone.name);
        this.phone = phone;
    }

    @Override
    public void charge(int l, int r, int g) {
   
        System.out.println(name + ":在使用专属的适配器给手机充电...");
        super.charge(l, r);
    }

(Client,客户端,演示小米手机使用手机专属的适配器,用三孔插座充电)

/**
 * 客户端
 */
public class Client {
   
    public static void main(String[] args) {
   
        // 小米手机使用手机专属的适配器,用三孔插座充电
        Phone phone = new Phone("小米手机");
        new PhoneAdapter(phone).charge(1, 1, 0);
    }
}

在这里插入图片描述

双向适配器

双向适配器,就是该适配器对二孔插头、三孔插头的充电器都可以适配,如下:

在这里插入图片描述

代码实现如下:

(MultipleAdapter,多重适配器,实现两个接口,注入两个对象,创建对应的两个构造方法)

/**
 * 多重适配器
 */
public class MultipleAdapter implements ThreePin, TwoPin{
   

    /**
     * 三孔插座
     */
    private ThreePin threePin;

    /**
     * 二孔插座
     */
    private TwoPin twoPin;

    public MultipleAdapter(ThreePin threePin) {
   
        this.threePin = threePin;
    }

    public MultipleAdapter(TwoPin twoPin) {
   
        this.twoPin = twoPin;
    }

    /**
     * 三孔插座充电
     * @param l
     * @param r
     * @param g
     */
    @Override
    public void charge(int l, int r, int g) {
   
        this.twoPin.charge(l, r);
    }

    /**
     * 二孔插座充电
     * @param l
     * @param r
     */
    @Override
    public void charge(int l, int r) {
   
        this.threePin.charge(l, r, 0);
    }
}

(Computer,创建一个电脑类,使用三孔插座的)

/**
 * 电脑
 */
public class Computer implements ThreePin{
   

    /**
     * 电脑名称
     */
    protected String name;

    public Computer(String name) {
   
        this.name = name;
    }

    @Override
    public void charge(int l, int r, int g) {
   
        System.out.println(name + ":充电中..." + l + "====" + r + "====" + g);
    }
}

(Client,客户端,演示手机、电脑使用多重适配器给手机充电)

/**
 * 客户端
 */
public class Client {
   
    public static void main(String[] args) {
   
        // 电脑使用多重适配器,用二孔插座充电
        Computer computer = new Computer("联想电脑");
        new MultipleAdapter(computer).charge(1,1);

        // 手机使用多重适配器,用三孔插座充电
        Phone phone = new Phone("小米手机");
        new MultipleAdapter(phone).charge(1,1,0);
    }
}

(不论是二孔插头还是三孔插头,都行)

在这里插入图片描述

以上就是适配器模式的内容,适配的思想还是非常常见的,在Java中,方法重载不正是适配器模式在方法上的一种体现吗?而适配器模式,是在类的层面上,对多种类、对象之间的一种适配。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书

相关推荐

  1. 设计模式_结构模式_适配器模式

    2023-12-09 23:48:05       50 阅读
  2. 设计模式结构模式适配器模式

    2023-12-09 23:48:05       50 阅读
  3. 设计模式结构设计模式——适配器模式

    2023-12-09 23:48:05       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 23:48:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 23:48:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 23:48:05       82 阅读
  4. Python语言-面向对象

    2023-12-09 23:48:05       91 阅读

热门阅读

  1. uniapp 开发app项目步骤

    2023-12-09 23:48:05       49 阅读
  2. Python基础学习文档(1)

    2023-12-09 23:48:05       39 阅读
  3. 【C3】【二维数组】【入门】交换行

    2023-12-09 23:48:05       49 阅读
  4. 我的K线图、反转图、砖型图和技术指标

    2023-12-09 23:48:05       52 阅读
  5. 编程中常见的技术难题:挑战与解决之道

    2023-12-09 23:48:05       45 阅读
  6. XMake构建Qt项目报错“undefined reference”

    2023-12-09 23:48:05       60 阅读
  7. TensorFlow的介绍

    2023-12-09 23:48:05       51 阅读
  8. Python处理Excel文件并与数据库匹配做拼接

    2023-12-09 23:48:05       45 阅读
  9. 单片机中的printf思考

    2023-12-09 23:48:05       58 阅读
  10. 分享一个用C#写的Aspose.Words生成word的工具类

    2023-12-09 23:48:05       45 阅读
  11. c语言编程题经典100例——(90~95例)

    2023-12-09 23:48:05       52 阅读