设计模式-外观模式

文章目录

一、详解

  • 概念:为多个子系统的交互 提供接口,供客户端使用
  • 主要用途:当一个系统的功能非常复杂,由很多个子系统组成时,可以使用外观模式对这些子系统进行封装,提供一个简单的接口给客户端使用
  • 代码:对外接口、封装多个子系统的实现类

二、代码

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

  • 文件上传为例:涉及到用户认证、文件上传、消息通知

  • 对外接口

    java 复制代码
    public interface FileFacade {
    
        /**
         * 文件上传,涉及到用户认证、文件上传、消息通知
         * @param filePath
         * @param fileName
         */
        void uploadFile(String filePath, String fileName);
    
    }
  • 封装多个系统交互的实现类

    java 复制代码
    public class FileFacadeImpl implements FileFacade {
    
        private AuthSystem authSystem;
    
        private FileSystem fileSystem;
    
        private MessageSystem messageSystem;
    
        public FileFacadeImpl(AuthSystem authSystem, FileSystem fileSystem, MessageSystem messageSystem) {
            this.authSystem = authSystem;
            this.fileSystem = fileSystem;
            this.messageSystem = messageSystem;
        }
    
        @Override
        public void uploadFile(String filePath, String fileName) {
            boolean hasAuth = authSystem.isAuthenticated();
            if (!hasAuth) {
                System.out.println("当前用户没有权限");
            }
            fileSystem.uploadFile(filePath, fileName);
    
            messageSystem.sendMessage("上传" + fileName + "到" + filePath + "目录");
        }
    }
    
    
    // 认证系统
    public interface AuthSystem {
    
        /**
         * 判断当前用户是否有权限
          */
        boolean isAuthenticated();
    
    }
    public class AuthSystemImpl implements AuthSystem {
    
        @Override
        public boolean isAuthenticated() {
            System.out.println("认证系统: 当前用户有操作权限");
            return true;
        }
    }
    
    
    // 文件系统
    public interface FileSystem {
    
        /**
         * 上传文件
         * @param filePath
         * @param fileName
         */
        void uploadFile(String filePath, String fileName);
    }
    public class FileSystemImpl implements FileSystem {
    
        @Override
        public void uploadFile(String filePath, String fileName) {
            System.out.println("文件系统: 文件目录: " + filePath + ", 上传的文件: " + fileName);
        }
    }
    
    // 消息系统
    public interface MessageSystem {
    
        /**
         * 发送消息
         * @param message
         */
        void sendMessage(String message);
    }
    public class MessageSystemImpl implements MessageSystem {
    
        @Override
        public void sendMessage(String message) {
            System.out.println("消息系统: 发送的消息: " + message);
        }
    }
  • 测试用例

    java 复制代码
    public class Demo {
    
        public static void main(String[] args) {
            AuthSystem authSystem = new AuthSystemImpl();
            FileSystem fileSystem = new FileSystemImpl();
            MessageSystem messageSystem = new MessageSystemImpl();
            FileFacade fileFacade = new FileFacadeImpl(authSystem, fileSystem, messageSystem);
    
            fileFacade.uploadFile("/resources", "test.doc");
        }
    }
    
    // 输出结果
    认证系统: 当前用户有操作权限
    文件系统: 文件目录: /resources, 上传的文件: test.doc
    消息系统: 发送的消息: 上传test.doc到/resources目录
相关推荐
why技术5 小时前
从18w到1600w播放量,我的一点思考。
java·前端·后端
夫唯不争,故无尤也5 小时前
JavaWeb流式传输速查宝典
java·流式传输
苏小瀚6 小时前
算法---位运算
java·算法
Camel卡蒙6 小时前
数据结构——二叉搜索树Binary Search Tree(介绍、Java实现增删查改、中序遍历等)
java·开发语言·数据结构
2401_841495646 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
珹洺6 小时前
Java-Spring入门指南(二十七)Android Studio 第一个项目搭建与手机页面模拟器运行
java·spring·android studio
程序猿DD7 小时前
Java 25 中的 6 个新特性解读
java·后端
稻草猫.7 小时前
文件 IO
java·笔记·后端·java-ee·idea
laopeng3017 小时前
基于Spring AI Deep Researcher Agent
java·人工智能·spring