设计模式之适配器模式

一、概述

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

二、适用性

1.你想使用一个已经存在的类,而它的接口不符合你的需求。

2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作。

3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行 子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

三、参与者

1.Target 定义Client使用的与特定领域相关的接口。

2.Client 与符合Target接口的对象协同。

3.Adaptee 定义一个已经存在的接口,这个接口需要适配。

4.Adapter 对Adaptee的接口与Target接口进行适配

四、类图

五、示例

Target接口

java 复制代码
public interface Target {
    void adapteeMethod();
    void adapterMethod();
}

Adaptee类

java 复制代码
public class Adaptee {
    public void adapteeMethod() {
        System.out.println("Adaptee method!");
    }
}

适配器类Adapter

java 复制代码
public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void adapteeMethod() {
        adaptee.adapteeMethod();
    }

    @Override
    public void adapterMethod() {
        System.out.println("Adapter method!");
    }
}

测试类

java 复制代码
public class TestAdapter {
    @Test
    public void ruleTest() {
        Target target = new Adapter(new Adaptee());
        target.adapteeMethod();
        target.adapterMethod();
    }
}

测试结果

bash 复制代码
Connected to the target VM, address: '127.0.0.1:3881', transport: 'socket'
Adaptee method!
Adapter method!
Disconnected from the target VM, address: '127.0.0.1:3881', transport: 'socket'

六、实践

文件中心服务开发。
文件操作适配相关总体目录

自研文件服务相关

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 自研文件服务接口
 */
public interface IFileOperateService {
    /**
     * 上传文件
     * @param dto 参数
     * @return 文件id
     */
    String upload(FileUploadDto dto);

    /**
     * 流式上传文件
     * @param streamDto 参数
     * @return 文件id
     */
    String upload4Stream(FileUploadForStreamDto streamDto);

    /**
     * 下载文件
     * @param fileId 文件id
     * @return 结果
     */
    FileDownloadDto download(String fileId);

    /**
     * 流式下载文件
     * @param fileId 文件id
     * @return 结果
     */
    FileDownloadForStreamDto download4Stream(String fileId);
}

实现

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 自研文件服务实现
 */
public class CustomFileOperateServiceImpl implements IFileOperateService {
    @Override
    public String upload(FileUploadDto dto) {
        System.out.println("自研文件服务上传文件...");
        return null;
    }

    @Override
    public String upload4Stream(FileUploadForStreamDto streamDto) {
        System.out.println("自研文件服务流式上传文件...");
        return null;
    }

    @Override
    public FileDownloadDto download(String fileId) {
        System.out.println("自研文件服务下载文件...");
        return null;
    }

    @Override
    public FileDownloadForStreamDto download4Stream(String fileId) {
        System.out.println("自研文件服务流式下载文件...");
        return null;
    }
}

第三方文件相关

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 第三方文件服务接口
 */
public interface IThirdPartyFileOperateService {
    /**
     * 上传文件
     * @param dto 参数
     * @return 文件id
     */
    String upload(FileUploadDto dto);

    /**
     * 流式上传文件
     * @param streamDto 参数
     * @return 文件id
     */
    String upload4Stream(FileUploadForStreamDto streamDto);

    /**
     * 下载文件
     * @param fileId 文件id
     * @return 结果
     */
    FileDownloadDto download(String fileId);

    /**
     * 流式下载文件
     * @param fileId 文件id
     * @return 结果
     */
    FileDownloadForStreamDto download4Stream(String fileId);
}

实现

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 阿里oss服务
 */
public class AliOssFileOperateServiceImpl implements IThirdPartyFileOperateService {

    @Override
    public String upload(FileUploadDto dto) {
        System.out.println("oss文件服务上传文件...");
        return null;
    }

    @Override
    public String upload4Stream(FileUploadForStreamDto streamDto) {
        System.out.println("oss文件服务流式上传文件...");
        return null;
    }

    @Override
    public FileDownloadDto download(String fileId) {
        System.out.println("oss文件服务下载文件...");
        return null;
    }

    @Override
    public FileDownloadForStreamDto download4Stream(String fileId) {
        System.out.println("oss文件服务流式下载文件...");
        return null;
    }
}

声明一个统一的适配标准

java 复制代码
/**
 * @author 
 * @createTime 2021年01月15日
 * @Description
 */
public interface FileOperateAdaptee extends IThirdPartyFileOperateService {
}

适配器-CustomFileOperateAdaptor

java 复制代码
/**
 * @author 
 * @createTime 2021年01月15日
 * @Description
 */
public class CustomFileOperateAdaptor implements FileOperateAdaptee {
    private final IFileOperateService customFileOperationService;

    public CustomFileOperateAdaptor(IFileOperateService customFileOperationService) {
        this.customFileOperationService = customFileOperationService;
    }

    @Override
    public String upload(FileUploadDto dto) {
        return customFileOperationService.upload(dto);
    }

    @Override
    public String upload4Stream(FileUploadForStreamDto streamDto) {
        return customFileOperationService.upload4Stream(streamDto);
    }

    @Override
    public FileDownloadDto download(String fileId) {
        return customFileOperationService.download(fileId);
    }

    @Override
    public FileDownloadForStreamDto download4Stream(String fileId) {
        return customFileOperationService.download4Stream(fileId);
    }
}

适配器-MultiWriteAndReadCustomOperateAdaptor

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 上传时多写,读取时优先从自研文件服务中读取的适配器
 */
public class MultiWriteAndReadCustomOperateAdaptor extends AbstractFileMultiWriteOperateAdaptor {
    public MultiWriteAndReadCustomOperateAdaptor(IFileOperateService fileOperationService, IThirdPartyFileOperateService thirdPartyFileOperationService) {
        super(fileOperationService, thirdPartyFileOperationService);
    }

    @Override
    public String upload(FileUploadDto dto) {
        System.out.println("MultiWriteAndRead文件服务上传文件...");
        return null;
    }

    @Override
    public String upload4Stream(FileUploadForStreamDto streamDto) {
        System.out.println("MultiWriteAndRead文件服务流式上传文件...");
        return null;
    }

    @Override
    public FileDownloadDto download(String fileId) {
        System.out.println("MultiWriteAndRead文件服务下载文件...");
        return null;
    }

    @Override
    public FileDownloadForStreamDto download4Stream(String fileId) {
        System.out.println("MultiWriteAndRead文件服务流式下载文件...");
        return null;
    }
}

文件服务工厂-FileOperateFactory

java 复制代码
/**
 * @author
 * @createTime 2021年01月15日
 * @Description 文件服务工厂
 */
public class FileOperateFactory {
    public static IThirdPartyFileOperateService getDefault() {
        return getInstance(EnumFileOperateType.MULTI_WRITE_AND_READ_FROM_CUSTOM);
    }

    /**
     * 获取对应的文件服务实例
     * @param operationType 类型
     * @return 实例
     */
    public static IThirdPartyFileOperateService getInstance(EnumFileOperateType operationType) {
        switch (operationType) {
            case OSS:
                return new AliOssFileOperateServiceImpl();
            case CUSTOM:
                return  new CustomFileOperateAdaptor(new CustomFileOperateServiceImpl());
            case MULTI_WRITE_AND_READ_FROM_CUSTOM:
                return  new MultiWriteAndReadCustomOperateAdaptor(new CustomFileOperateServiceImpl(),
                        new AliOssFileOperateServiceImpl());
            default:
                throw new IllegalArgumentException("storageType is not support");
        }
    }
}

自测

java 复制代码
@Test
public void fileTest() {
    IThirdPartyFileOperateService operateService =            FileOperateFactory.getInstance(EnumFileOperateType.MULTI_WRITE_AND_READ_FROM_CUSTOM);
    operateService.upload(new FileUploadDto());

    operateService.download("this is fileId");
}

自测结果

bash 复制代码
Connected to the target VM, address: '127.0.0.1:6502', transport: 'socket'
MultiWriteAndRead文件服务上传文件...
MultiWriteAndRead文件服务下载文件...
Disconnected from the target VM, address: '127.0.0.1:6502', transport: 'socket'
相关推荐
哪 吒7 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10227 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神10 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术11 小时前
23种设计模式速记法
设计模式
小白不太白95012 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白95012 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i12 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95020 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus21 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大21 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式