设计模式-适配器模式

文章目录

一、详解

  • 概念:定义一个适配器 ,将一个接口 适配满足另一个接口需求
  • 主要用途
    • 用于连接两个互不兼容的接口场景:比如订单数据同步道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
相关推荐
秋饼2 分钟前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发
Escalating_xu8 分钟前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
何以解忧,唯有..19 分钟前
Python os模块详解:文件与目录操作指南
java·服务器·python
Csxyzj30 分钟前
kubernetes集群部署方法
java·linux·kubernetes
SQL-First布道者36 分钟前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
小蒜学长1 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
凤山老林1 小时前
轻量级规则引擎落地:Spring Boot 集成 LiteFlow 实现动态业务编排与热更新
java·spring boot·后端·规则引擎·liteflow
夏贰四1 小时前
管控数据加载调度如何规避任务冲突?数据加载运维监控体系该如何搭建?
java·大数据·运维
山甫aa2 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
鱼鳞_2 小时前
热门八股-JVM
java·jvm