二十三种设计模式第十篇--外观模式

news2024/11/20 15:13:40

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门(政务窗口 )能解决一切手续问题就好了。

软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

外观(Facade)模式/门面模式 的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。

模式的结构
外观(Facade)模式包含以下主要角色。

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
  • 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

在这里插入图片描述
文件保存类, 充当子类系统类

public class FileWriter {

    public void write(String encryptStr, String path) {
        try (FileOutputStream fileOutputStream = new FileOutputStream(path)) {
            fileOutputStream.write(encryptStr.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件读取类, 充当子系统类

public class FileReader {

    public String read(String path) {
        StringBuilder stringBuffer = new StringBuilder();
        try (FileInputStream fileInputStream = new FileInputStream(path)) {
            int data = 0;
            while ((data = fileInputStream.read()) != -1) {
                stringBuffer.append((char) data); //char
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }
}

加密外观类, 充当外观类

public class EncryptFacade {

    //维持对子系统对象的引用
    private FileReader fileReader;
    private CipherMachine cipherMachine;
    private FileWriter fileWriter;

    public EncryptFacade() {
        fileReader = new FileReader();
        cipherMachine = new CipherMachine();
        fileWriter = new FileWriter();
    }

    //对外提供的门面方法,  调用子系统对象的业务方法
    public void fileEncrypt(String fromPath, String toPath) {
        String text = fileReader.read(fromPath);
        System.out.println(">>>>>>>>>> : 读取文件[ " + fromPath + " ]中的明文数据 : " + text);
        String encryptStr = cipherMachine.encrypt(text);
        System.out.println(">>>>>>>>>> : 明文数据加密后的结果 : " + encryptStr);
        fileWriter.write(encryptStr, toPath);
    }
}

数据加密类(求模运算), 充当子系统类

public class CipherMachine {

    public String encrypt(String text) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i) % 7);
            result.append(s);
        }
        return result.toString();
    }
}

客户端测试类

public class ClientTest {

    /**
     * 下面是一个使用外观设计模式的简单示例程序 : 写一个用于文件加密的模块,该模块的功能为对指定文件中的数据进行加密并将加密之后的数据保存到新的文件中.
     * 具体流程包括三个部分 : 读取源文件中的数据, 数据加密, 将加密后的数据写入到新文件
     */

    private static final String FROM_PATH = "Picture\\from.txt";
    private static final String TO_PATH = "Picture\\to.txt";

    public static void main(String[] args) {
        //只要调用门面类的方法就能完成文件内容读取, 加密的操作了,调用比一个方法一个方法的调用要简单。
        EncryptFacade encryptFacade = new EncryptFacade();
        encryptFacade.fileEncrypt(FROM_PATH, TO_PATH);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年小型水库安全监测能力提升解决方案

一、方案背景 2023年小型水库安全监测能力提升试点项目建设将按照“统一规划、统一标准、统一实施、统一管理、统一支撑”的工作要求&#xff0c;对全区小型水库雨水情测报和监测设施建设项目按高水平、高标准、高质量要求开展安全监测能力提升建设&#xff0c;同步开展水工程安…

ZeLinAI是什么?国产ChatGPT快速搭建自己的AI应用

ChatGPT使用门槛高&#xff0c;需要科学上网短信接码等&#xff0c;不如直接选择国产ZelinAI&#xff0c;使用超简单轻轻松松从0到1零代码创建自己的AI应用。目前模型仅支持GPT-3.5-turbo&#xff0c;后续应该会接入文心一言、GPT-4、GPT-4.5和Bard&#xff0c;新手站长分享国产…

DL.to 最新研究(论文)推荐——分割、CVPR、扩散模型、感受野注意力模块

目录 一、CVPR 1.CrowdCLIP:基于视觉-语言模型的无监督人群计数 CrowdCLIP: Unsupervised Crowd Counting via Vision-Language Model 2.Beyond mAP&#xff1a;更好地评估实例分割 Beyond mAP: Re-evaluating and Improving Performance in Instance Segmentation with Se…

基于低代码平台的多租户解决方案

在云计算时代&#xff0c;“多租户”是一个非常重要的概念。根据百度百科中的定义&#xff0c;多租户技术是一种软件架构技术&#xff0c;简单来说是指以单一系统架构与服务提供多数客户端相同甚至可定制化的服务&#xff0c;并且仍然可以保障客户的数据在多租户环境中&#xf…

Redis之bitmap/hyperloglog/GEO

Redis之bitmap/hyperlog/GEO 一 面试题引入二 统计的类型三 hyperloglog3.1 行业术语3.2 hyperloglog基础3.2.1 基数3.2.2 定义3.2.3 基数统计3.2.4 基本命令 3.3 HyperLogLog原理3.3.1 去重复统计的方式3.3.2 原理 3.4 HyperLogLog案例实战3.4.1 需求3.4.2 方案讨论3.4.3 Hype…

五、SpringMVC从入门到入坟

一、SpringMVC概念 SpringMVC 是 Spring 框架中的一个模块&#xff0c;它是一个基于 MVC设计模式的 Web 框架&#xff0c;用于构建基于 Java 技术的 Web 应用程序。Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。 它的主要原理是将 Web 应用程序分成模型&…

实时频谱-2.4窗口函数

窗口函数 在离散傅立叶变换(DFT)分析运算中&#xff0c;一个固有的假设是要处理的数据是单个周期定期重复的信号。例如&#xff0c;在图2-8中的帧2上应用DFT处理时&#xff0c;信号上会进行周期性扩展。 在连续的帧之间一般会发生不连续点&#xff0c;如图 2-9 所示。 这些人…

平板电脑哪种电容笔更好用?平价好用的iPad电容笔推荐

我是一个非常喜欢数码产品的发烧者&#xff0c;多少了解一些关于电容笔的知识。我想&#xff0c;苹果原装的电容笔与普通的电容笔的不同之处就是他们所能产生的压力感觉不同。由于苹果的电容笔拥有独一无二的“重力压感”&#xff0c;使得它可以让我们在一幅画面中快速填充色彩…

Docker笔记8 | Docker内部以及容器之间如何管理数据?

8 | Docker内部以及容器之间如何管理数据&#xff1f; 1 数据卷1.1 什么是数据卷&#xff1f;1.2 数据卷的特性1.3 创建数据卷1.4 查看数据卷1.5 启动挂在数据卷的容器1.6 删除数据卷 2 挂在主机目录2.1 挂载主机目录作为数据卷2.2 查看数据卷信息2.3 挂载本地主机文件作为数据…

深度学习基础入门篇-序列模型[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

中原雄狮官网上线 | LTD物流服务行业案例分享

​一、公司介绍 中原雄狮崛起于2017年&#xff0c;彼时&#xff0c;全国货运行业存在许多不良行为&#xff0c;无赖货主和黑心货站恶意拖欠货车司机运费&#xff0c;而货车司机作为弱势群体却势单力薄无依无助的问题&#xff0c;为了让司机的血汗钱能颗粒归仓&#xff0c;中原雄…

一个活人的标准:灵·魂·身体到底是咋回事儿

正常情况 人类对自我的探求一直没有减弱过&#xff0c;总是在发现并给我们带来惊喜。今天也通过神赐给我们的圣经来跟大家分享一下灵魂身体之间的关系。 神创造了人&#xff0c;并给了人独一的灵。所以人是万物的灵长&#xff0c;比任何生物都聪明。一个“活人”必须要有的就是…

计算机图形学 | 有趣的测试和合并——片元操作

计算机图形学 | 有趣的测试和合并——片元操作 计算机图形学 | 有趣的测试和合并——片元操作10.1 再看片元操作片元操作几个重要的缓冲区 10.2 谁遮住了我&#xff1f;消隐的概念面剔除深度测试深度缓冲器算法&#xff08;Z-buffer算法&#xff09;深度排序算法&#xff08;de…

新华三发布绿洲平台3.0,五大能力升级,构筑坚实用数底座

当前我国数字经济飞速发展&#xff0c;据中国信息通信研究院发布的《中国数字经济发展研究报告&#xff08;2023年&#xff09;》显示&#xff0c;2022年&#xff0c;我国数字经济规模达到50.2万亿元&#xff0c;同比名义增长10.3%&#xff0c;已连续11年显著高于同期GDP名义增…

HTTP协议概述(见过花开就好了,何必在意花落谁家呢)

文章目录 一、简介二、HTTP版本三、HTTP 方法四、HTTP状态码五、HTTP 请求流程分析1.请求报文2.响应报文 一、简介 客户端输入域名&#xff0c;经域名解析成IP地址&#xff0c;在与服务端建立数据传输之前&#xff0c;要先建立TCP连接&#xff08;三次握手&#xff09;&#x…

Day03 02-MySQL多表查询详解

文章目录 第八章 多表查询8.1 多表查询介绍8.1.1 什么是多表查询8.1.2 多表查询基本写法8.1.3 笛卡尔积8.1.4 连接查询条件限制 8.2 连接查询分类8.2.1 内连接8.2.2 外连接8.2.3 全连接8.2.4 自然连接 8.3 子查询8.3.1 子查询简介8.3.2 在where子句中8.3.3 在from子句中8.3.4 在…

是德科技keysight E8257D信号发生器

产品概览 Keysight E8257D (Agilent) PSG 模拟信号发生器提供业界领先的输出功率、电平精度和高达 67 GHz 的相位噪声性能&#xff08;工作频率可达 70 GHz&#xff09;。Agilent PSG 模拟信号发生器的高输出功率和卓越的电平精度通常无需使用外部放大器来测试高功率设备&…

国内热门AI智能音箱品牌都采用了哪些功放芯片

音频功放IC是各类音响、耳机等器材不可或缺的一部分&#xff1b;音频功率放大器芯片俗称“扩音器”&#xff0c;是音响系统中最基本的设备&#xff0c;负责将来自信号源的微弱电信号进行放大&#xff0c;以驱动扬声器发声&#xff0c;从而将声音传至我们的听觉系统。 现如今&a…

浅谈电解电容在电路设计中的作用

谈起电解电容我们不得下多了解一下它的作用 1、滤波作用 在电源电路中&#xff0c;整流电路将交流变成脉动的直流&#xff0c;而在整流电路之后接入一个较大容量的电解电容&#xff0c;利用其充放电特性(储能作用)&#xff0c;使整流后的脉动直流电压变成相对比较稳定的直流电…

启动页/闪屏/引导页-你还傻傻分不清?

启动页/闪屏/引导页-你还傻傻分不清&#xff1f;&#xff08;转载&#xff09; - 知乎 今天就跟大家一起来认识一下开屏三姐妹&#xff1a;启动页/闪屏/引导页。 通常三姐妹出场顺序如下&#xff1a; 下面我们来深入认识一下这三姐妹&#xff1a; 1、启动页 定义&#xff1…