设计模式-适配器模式

4 篇文章 0 订阅
2 篇文章 0 订阅

适配器模式

简单介绍

适配器模式用于解决两个不同对象之间的兼容问题。比如我们要对接第三方服务,他们的传递过来的数据和我们使用的数据之间是不兼容的,这就需要我们加一个中间层来处理兼容问题。我们需要把我们的数据提取出来,然后拼接成他们想要的数据,请求他们,然后从他们的服务获得结果,然后解析结果,更新我们的表里面的数据。在我们的生活中,很多地方都用到了适配器模式,比如,电源适配器,usb读卡器等.

我们的电脑有很多接口,比如usb,我们的电脑要想读取存储卡里面的数据,就需要一个设备。这个设备叫做读卡器,读卡器作为一个适配器,实现了usb接口,并且能够读取存储卡的数据,那电脑就能通过usb接口来和这个适配器来进行通信,我们创建一个例子

先看一下类间关系

继承关系

在这里插入图片描述

代码实现

首先就是我们的usb接口

public interface IUSB {
    /**
     * usb供电
     * @param voltage
     */
    void powerOn(Double voltage);

    void readData();
}

我们的usb接口,定义了两个方法,一个方法用来供电,一个方法用来获取原始数据

接下来看看读卡器接口

public interface ICardReader extends IUSB{
    void insertFlashMemory(IFlashMemory flashMemory);
}

读卡器需要插入存储卡,这就定义了一个继承usb接口的读卡器接口

然后看一下实现了读卡器接口的一个类

public class XXCardReader implements ICardReader {
    private IFlashMemory flashMemory;
    boolean isPowerOn=false;
    @Override
    public void insertFlashMemory(IFlashMemory flashMemory) {
        this.flashMemory=flashMemory;
    }

    @Override
    public void powerOn(Double voltage) {
        if(Math.abs(voltage-5)<=1){
            System.out.println("好的,usb正常供电");
            isPowerOn=true;
        }else{
            System.out.println("供电错误");
            isPowerOn=false;
        }
    }

    @Override
    public void readData() {
        if(isPowerOn){
            System.out.println(flashMemory.getRawData());
        }else{
            System.out.println("读卡器没能正常供电");
        }
    }
}

读卡器首先要供电,如果电压5v左右就就行

然后我们看一下电脑接口


public interface IComputer {
    /**
     * 供电
     * @param
     */
    boolean powerOn();

    /**
     * 获得电脑可用的usb数量
     * @return
     */
    int getAvailableUsbs();

    /**
     * 往指定索引插上usb索引
     * @param index
     * @param iusb
     */
    void insertUsb(int index,IUSB iusb);

    /**
     * 获得这个电脑上插入的usb设备
     * @param index
     * @return
     */
    IUSB getUsbDevice(int index);

    /**
     * 给电脑设置电源适配器
     * @param adapter
     */
    void setPowerAdapter(IPowerAdapter adapter);

    /**
     * 获得usb的电压
     * @return
     */
    Double getUsbVoltage();
}

电脑需要开机,需要获得可用的usb接口数量,然后插入usb设备,获得usb设备,插上电源适配器,以及获得usb电压

然后我们看一下实现了电脑接口的一个类

public class HaseeComputer implements IComputer{

    private List<IUSB> usbDevices=new ArrayList<>();

    private IPowerAdapter adapter;

    private boolean isPowerOn=false;
    @Override
    public boolean powerOn() {
        if(adapter==null){
            System.out.println("没有适配器");
            return false;
        }

        if(Math.abs(adapter.output()-19)<=3){
            //给所有usb供电
            for(IUSB iusb:usbDevices){
                iusb.powerOn(getUsbVoltage());
            }
            System.out.println("好了,电脑正在供电");
            isPowerOn=true;
            return true;
        }else{
            System.out.println("电源适配器输出有问题,无法正常供电,需要19v电压");
            isPowerOn=false;
            return false;
        }
    }

    @Override
    public int getAvailableUsbs() {
        return 5;
    }

    @Override
    public void insertUsb(int index, IUSB iusb) {
        if(index>getAvailableUsbs()-1){
            System.out.println("当前电脑只有"+getAvailableUsbs()+"个usb设备,不能往"+index+"索引插入usb设备");
            return;
        }
        System.out.println("已经往电脑"+index+"索引插入usb设备");
        usbDevices.add(index,iusb);
    }

    @Override
    public IUSB getUsbDevice(int index) {
        if(!isPowerOn){
            System.out.println("电脑未开机");
            return null;
        }
        if(index>getAvailableUsbs()-1){
            System.out.println("当前电脑只有"+getAvailableUsbs()+"个usb设备,不能往"+index+"索引插入usb设备");
            return null;
        }
        return usbDevices.get(index);
    }

    @Override
    public void setPowerAdapter(IPowerAdapter adapter) {
        this.adapter=adapter;
    }

    @Override
    public Double getUsbVoltage() {
        return 5D;
    }
}

我们再写一个测试类来测试一下

public class Content {
    public static void main(String[] args) {
        HaseeComputer haseeComputer = new HaseeComputer();
        XXCardReader xxCardReader = new XXCardReader();
        xxCardReader.insertFlashMemory(new IFlashMemory() {
            @Override
            public String getRawData() {
                return "我是存储卡,原始数据";
            }
        });
        haseeComputer.insertUsb(0, xxCardReader);
        haseeComputer.setPowerAdapter(new IPowerAdapter() {
            @Override
            public Double input() {
                return 220D;
            }

            @Override
            public Double output() {
                return 19D;
            }
        });
        haseeComputer.powerOn();
        IUSB userDevice = haseeComputer.getUsbDevice(0);
        userDevice.readData();
    }
}

output:

已经往电脑0索引插入usb设备
好的,usb正常供电
好了,电脑正在供电
我是存储卡,原始数据

Process finished with exit code 0

可以看见,这里我们用了适配器设计模式,两个对象之间通过接口来进行调用,然后接口的实现交给适配器,这种写法很灵活,调用者只需要根据接口来调用就行了
完整代码可以去我的GitHub

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值