设计模式之适配器模式

一、概述

将一个类的接口转换成客户希望的另外一个接口。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'
相关推荐
lxyzcm12 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千12 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)13 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲14 小时前
设计模式——桥接模式
设计模式·桥接模式
捕鲸叉18 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
小小小妮子~19 小时前
框架专题:设计模式
设计模式·框架
先睡19 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Damon_X1 天前
桥接模式(Bridge Pattern)
设计模式·桥接模式
越甲八千1 天前
重温设计模式--享元模式
设计模式·享元模式
码农爱java1 天前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式