设计模式之适配器模式

一、概述

将一个类的接口转换成客户希望的另外一个接口。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'
相关推荐
静水流深_沧海一粟9 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder9 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室16 小时前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦1 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式