适配器模式

适配器模式

好久没有写博客了,最近都挺忙的,今天晚上睡不着,想想也不知道干啥,把最近自己在小组分享的适配器设计模式写出来,也就是按照自己ppt的流程来的。以后有空,陆陆续续把小组分享的设计模式写成博客。

1 问题的引入

long long ago,还记得在初中的时候,我们用手机拍了好多好看的图片,图片存在手机的内存卡(tf卡)里,某一天需要把好看的图片上传到QQ空间,那么如何把tf卡里的照片传输到电脑上呢?
如何用肚读取tf卡的内容

1.1 我们的方式

在这里插入图片描述

2 适配器介绍及定义

在软件开发中有时也会存在以上电脑和TF卡不兼容的情况,这样可以引入SD卡(类似读卡器)那样一个适配器来协调这些存在不兼容的结构,这种设计方案就是适配器模式。

定义:
将一个类的接口变换成客户端所期待的另一种接口,适配器模式让那些接口不兼容的类可以一起工作。

2.1 适配器种类

适配器模式包括对象适配器和类适配器。

2.2 UML图

适配器模式UML
Target(目标抽象类): 抽象定义客户所需的接口,可以是一个抽象类,或者接口,也可以是具体类。
Adaptee(适配者类): 它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包括了客户所需要的业务方法。
Adapter(适配器类): 它可以调用另一个接口,作为一个转换器,对Adapter和Target进行适配。适配器是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系;在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

2.3 两种适配器的区别

区别:
1.在对象适配器模式当中,适配器和适配者是关联关系。
对象适配器代码显示
2.在类适配器模式中,适配器和适配者之间是继承(或者实现)关系。
类适配器代码显示
3.由于Java不支持多重类继承,因此类适配器的使用受到很多限制,例如如果目标抽象类Target不是接口,而是一个类,就无法使用类适配器。大部分情况下我们使用的是对象适配器,类适配器较少使用。

3代码讲解

实例: 回到刚开头的那个例子,计算机如何通过SD(读卡器)读取TF卡(通过对象适配器的模式)?
在这里插入图片描述

3.1 编写Target

3.1.1 声明Computer接口及其具体实现类
public interface Computer {
    /**
     * sdCard对象传参
     * @param sdCard
     * @return
     */
    String readSD(SDCard sdCard);
}
public class ThinkpadComputer implements Computer {
    /**
     * 创建一个计算机实例,实现计算机接口,并实现其读取SD卡方法
     * @param sdCard
     * @return
     */
    @Override
    public String readSD(SDCard sdCard) {
        if(sdCard == null){
            throw new NullPointerException("sdCard is null");
        }
        //返回sdCard的read方法
        return sdCard.readSD();
    }
}
3.1.2 声明SDCard接口及其具体实现类
public interface SDCard {
    /**
     * 创建一个SD卡的接口,读取SD卡
     * @return
     */
    String readSD();
}
public class SDCardImpl implements SDCard {
    /**
     * 创建SD卡接口的实现类,模拟SD卡的功能:
     * @return
     */
    @Override
    public String readSD() {
        String msg = "sdCard read a message: wow this is sdCard!";
        return msg;
    }
}

3.2 编写Adaptee

3.2.1 创建TF卡接口及其具体实现类
public interface TFCard {
    /**
     * 创建TF卡接口
     * @return
     */
    String readTF();
}
public class TFCardImpl implements TFCard {
    /**
     * 创建TF卡实例
     * @return
     */
    @Override
    public String readTF() {
        String msg ="tfCard read e message : wow this is  tfCard.";
        return msg;
    }
}

3.3 编写Adapter

3.3.1 创建适配器类
public class SDAdapterTF implements SDCard {
    /**
     * 创建SD卡适配TF卡 ,实现SDCard接口
     * 将要适配的对象作为适配器的属性引入
     */
    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard){
        this.tfCard = tfCard;
    }

    @Override
    public String readSD() {
        System.out.println("adapter read tfCard.");
        return tfCard.readTF();
    }
}

3.4 创建Client

3.4.1 创建测试方法调用
/**
     * 测试计算机通过SD读卡器读取TF卡
     */
    @Test
    public void test(){
        //模拟计算机通过SD读卡器读取TF卡
        Computer computer = new ThinkpadComputer();
        TFCard tfCard = new TFCardImpl();
        SDCard tfCardAdapterSD = new SDAdapterTF(tfCard);
        System.out.println(computer.readSD(tfCardAdapterSD));
    }

4 总结

适用场景:
将一个类的接口变换成客户端所期待的另一种接口,适配器模式让那些接口不兼容的类可以一起工作。

两类适配器:
对象适配器和类适配器,类适配器较少使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值