设计模式-适配器模式

文章目录

一、详解

  • 概念:定义一个适配器 ,将一个接口 适配满足另一个接口需求
  • 主要用途
    • 用于连接两个互不兼容的接口场景:比如订单数据同步道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
相关推荐
房开民1 天前
c++总结
java·开发语言·c++
好大哥呀1 天前
C++ 多态
java·jvm·c++
毕设源码-赖学姐1 天前
【开题答辩全过程】以 基于Java的医院器材管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
float_com1 天前
【java常用API】----- Arrays
java·开发语言
LuckyTHP1 天前
迁移shibboleth java获取shibboleth用户信息
java·开发语言
客卿1231 天前
数论===质数统计(暴力法,)
java·开发语言
华科易迅1 天前
Spring 事务(注解)
java·数据库·spring
写代码的小阿帆1 天前
Web工程结构解析:从MVC分层到DDD领域驱动
java·架构·mvc
东离与糖宝1 天前
Java 26+Spring Boot 3.5,微服务启动从3秒压到0.8秒
java·人工智能
禹中一只鱼1 天前
【力扣热题100学习笔记】 - 哈希
java·学习·leetcode·哈希算法