设计模式-适配器模式

文章目录

一、详解

  • 概念:定义一个适配器 ,将一个接口 适配满足另一个接口需求
  • 主要用途
    • 用于连接两个互不兼容的接口场景:比如订单数据同步道ERP系统,但两个数据格式不兼容,这时可以用适配器模式转换数据格式
    • 适配第三方服务商API:比如云存储功能,需要适配器兼容不同的第三方服务商API,从而达到服务商的切换
  • 代码:接口A、适配器、接口B(不一定是接口,可以是类)

二、代码

  • 源码:https://gitee.com/deschen/designPattern-study

  • 以云存储为例,需要兼容不同服务商API

  • 文件操作接口

    java 复制代码
    public interface Storage {
    
        /**
         * 上传文件
         * @param filePath 文件路径
         * @param fileName 文件名称
         */
        void uploadFile(String filePath, String fileName);
    }
  • 不同云存储服务商API

    java 复制代码
    /**
     * 模拟阿里云OSS服务商API
     */
    public class OssClient {
    
        public void putObject(String bucketName, String key, InputStream input) {
            System.out.println("阿里云OSS上传文件成功,文件名: " + key);
        }
    }
    
    /**
     * 模拟Minio服务商API
     */
    public class MinioClient {
    
        public void putObject(PutObjectArgs args) {
            System.out.println("Minio上传文件成功,文件名: " + args.getObjectName());
        }
    
        public static class PutObjectArgs {
    
            private InputStream stream;
    
            private String objectName;
    
            public InputStream getStream() {
                return stream;
            }
    
            public void setStream(InputStream stream) {
                this.stream = stream;
            }
    
            public String getObjectName() {
                return objectName;
            }
    
            public void setObjectName(String objectName) {
                this.objectName = objectName;
            }
        }
    
    }
  • 不同服务商的适配器

    java 复制代码
    /**
     * 阿里云OSS API适配器
     */
    public class OssAdapter implements Storage {
    
        private OssClient ossClient;
    
        public OssAdapter(OssClient ossClient) {
            this.ossClient = ossClient;
        }
    
        @Override
        public void uploadFile(String filePath, String fileName) {
            try (InputStream input = getClass().getResourceAsStream(filePath)) {
                ossClient.putObject("bucketName", fileName, input);
            } catch (IOException e) {
                throw new RuntimeException("读取文件失败");
            }
        }
    }
    
    /**
     * Minio API 适配器
     */
    public class MinioAdapter implements Storage {
    
        private MinioClient minioClient;
    
        public MinioAdapter(MinioClient minioClient) {
            this.minioClient = minioClient;
        }
    
        @Override
        public void uploadFile(String filePath, String fileName) {
            try (InputStream input = getClass().getResourceAsStream(filePath)) {
                MinioClient.PutObjectArgs putObjectArgs = new MinioClient.PutObjectArgs();
                putObjectArgs.setStream(input);
                putObjectArgs.setObjectName(fileName);
                minioClient.putObject(putObjectArgs);
            } catch (IOException e) {
                throw new RuntimeException("读取文件失败");
            }
        }
    }
  • 用例

    java 复制代码
    public class Demo {
    
        public static void main(String[] args) {
            Storage ossStorage = new OssAdapter(new OssClient());
            ossStorage.uploadFile("resource.txt", "resource.txt");
    
            Storage minioStorage = new MinioAdapter(new MinioClient());
            minioStorage.uploadFile("resource.txt", "resource.txt");
        }
    }
    
    // 输出结果
    阿里云OSS上传文件成功,文件名: resource.txt
    Minio上传文件成功,文件名: resource.txt
相关推荐
Mahir0819 分钟前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
RyFit2 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码2 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事2 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海2 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠3 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
德思特4 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag
YOU OU4 小时前
Spring IoC&DI
java·数据库·spring
один but you4 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
是码龙不是码农5 小时前
ThreadPoolExecutor 7 个核心参数详解
java·线程池·threadpool