设计模式-外观模式

文章目录

一、详解

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

二、代码

  • 源码: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目录
相关推荐
RANCE_atttackkk5 分钟前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
五岳1 小时前
DTS按业务场景批量迁移阿里云MySQL表实战(下):迁移管理平台设计与实现
java·应用·dts
zhougl9961 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手1 小时前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋1 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言
Mr_Xuhhh2 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
测试开发Kevin3 小时前
小tip:换行符CRLF 和 LF 的区别以及二者在实际项目中的影响
java·开发语言·python
笨手笨脚の3 小时前
Redis: Thread limit exceeded replacing blocked worker
java·redis·forkjoin·thread limit
Lenyiin3 小时前
Linux 基础IO
java·linux·服务器
松☆3 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言