每日一个设计模式之【外观模式】

news2025/7/22 21:51:33

文章目录

  • 每日一个设计模式之【外观模式】
    • ☁️前言🎉🎉🎉
    • 🌻外观模式概述
    • 🌱外观模式的实现
    • 🌲总结

每日一个设计模式之【外观模式】

☁️前言🎉🎉🎉

  大家好✋,我是知识汲取者😄,今天给大家带来一篇有关外观模式的学习笔记。众所周知能够熟练使用设计模式是一个优秀程序猿的必备技能,当我们在项目中选择一个或多个合适的设计模式,不仅能大大提高项目的稳健性可移植性可维护性,同时还能让你的代码更加精炼,具备艺术美感

  在生活中,外观模式处处可见,电脑的开机按钮、电源开关总闸等等都是拥有外观模式的思想在其中的,同样的在编程世界中,外观模式就显得更为常见了,诸如分层开发,统一的接口设计,一键**这些都可以看作是一个个外观模式的应用,外观模式提供了一个统一的接口让用户更容易操作系统,现在就让我们来好好学习一下这么一个常见且重要的设计模式吧😃

加油

推荐阅读

  • 设计模式导学:🚪传送门
  • 每日一个设计模式系列专栏:🚪传送门
  • 设计模式专属Gitee仓库:✈启程
  • 设计模式专属Github仓库:🚀上路
  • 知识汲取者的个人主页:💓点我哦

csdn

🌻外观模式概述

  • 什么是外观模式

    外观模式(Facade Pattern)又称为门面模式,是一种对象结构型模式,它提供了一个统一高层次的接口,让外界通过该接口访问内部子系统的一群接口

    PS:外观模式是迪米特法则的一种具体实现

  • 外观模式的作用:隐蔽子系统的复杂性,简化子系统的接口,让子系统变得更加容易使用

  • 外观模式的优缺点

    • 优点

      • 降低了系统的耦合度。外界只需要和外观接口进行交互即可,不必与每一个子接口进行交互
      • 提高了系统的灵活性。外观模式在降低了子系统与外部的耦合度,让子系统能够有更多的变化而不受外部的影响
      • 提高系统的可维护性。外观模式让系统进行了分层,进一步降低了系统的耦合度,让系统的后期维护变得更加简单
      • 让系统变得更加容易使用。外观模式对一群子系统的接口进行了重新封装,让复杂大量的子系统接口变成一个统一的接口,大大简化了系统的使用难度

      ……

    • 缺点

      • 存在安全隐患。外观模式不能很好地限制客户端直接使用子系统类,很容易倒置客户端的使用者出现错误操作影响系统的正常运行,但如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性,所以鱼与熊掌不可兼得
      • 模式设计较复杂,需要具有一定开发经验,如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则,导致系统维护成本很大

      ……

  • 外观模式的适用场景

    • 系统较为复杂,子系统较多时,推荐使用外观模式
    • 客户端程序与多个子系统之间存在很大的依赖性时,推荐使用外观模式
    • 想要预防低水平人员带来的风险,推荐使用外观模式

    ……

    生活中的应用:交互机(所有信息都有交互机进行统一分发管理)、导游(旅游景区众多,游客如果想要一一了解则需要花费大量的时间,但是通过导游就可以快速了解)

    编程中的应用:Java中的分层开发,也可以说是三层架构,就是利用了外观模式的设计思想,每一层都有一个统一的接口,负责和其它层进行交互,大大降低了系统的耦合度

  • 外观模式的角色划分

    • 外观角色(Facade):也可称之为系统窗口,是外观模式的核心角色,内部含有大量子系统的引用,负责和客户端进行交互,可以是方法、具体的类、抽象类、接口,只要能够提供一个统一的接口都可以是外观角色
    • 子系统(SubSystem):是系统的主要组成部分,所有子系统共同构件一个完整的系统
    • 客户端(Client):是系统的外部使用者(对应本文示例中的测试类)

🌱外观模式的实现

示例

在计算机主机(Host)中,只需要按下主机的开机按钮,即可以调用其他硬件设备和软件的启动方法,如内存(Memory)的自检,CPU的运行,硬盘(HardDisk)的读取,操作系统(OS)的载入等,如果某一过程发生错误则计算机启动失败。使用外观模式模拟该过程,并编程实现。

思考:想象一下如果没有主机上的开关,那么电脑的其它部件都需要我们一个个手动去启动那该是一件多么困难的事情,不仅要熟练掌握每一个部件如何开启,还需要注意每一个部件的开启顺序,而使用外观模式,只需在主机上轻轻一按,电脑就能成功启动了,是不是觉得轻松多了

image-20221115160640195

创建子系统
创建外观类
编写测试类
  • Step1:创建子系统

    1)CPU:

    package com.hhxy.computer;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title CPU
     * @description
     */
    public class CPU {
        public void run(){
            System.out.println("CPU运行了");
        }
    }
    

    2)硬盘:

    package com.hhxy.computer;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 硬盘
     * @description
     */
    public class HardDisk {
        public void read(){
            System.out.println("硬盘开始读取数据");
        }
    }
    

    3)内存:

    package com.hhxy.computer;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 内存
     * @description
     */
    public class Memory {
        public void check(){
            System.out.println("内存开始自检");
        }
    }
    

    4)操作系统:

    package com.hhxy.computer;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 操作系统
     * @description
     */
    public class OS {
        public void load(){
            System.out.println("操作系统开始载入");
        }
    }
    
  • Step2:创建外观类

    主机:

    package com.hhxy.computer;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 主机(外观类)
     * @description 用于和客户进行交互,统一管理电脑硬件和软件的启动
     */
    public class Host {
        CPU cpu;
        HardDisk hardDisk;
        Memory memory;
        OS os;
        public Host(){
            cpu = new CPU();
            hardDisk = new HardDisk();
            memory = new Memory();
            os = new OS();
        }
    
        /**
         * 开机的方法
         */
        public void startUp(){
            cpu.run();
            hardDisk.read();
            memory.check();
            os.load();
        }
    }
    
  • Step3:编写测试类

    package com.hhxy.test;
    
    
    import com.hhxy.computer.Host;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 测试类2
     * @description 用于模拟使用外观模式
     */
    public class Test2 {
        public static void main(String[] args) {
            Host host = new Host();
            host.startUp();
        }
    }
    

    测试结果:

    image-20221115161038792

    如果不使用外观类,就需要手动启动电脑的每一个部件:

    package com.hhxy.test;
    
    
    import com.hhxy.computer.CPU;
    import com.hhxy.computer.HardDisk;
    import com.hhxy.computer.Memory;
    import com.hhxy.computer.OS;
    
    /**
     * @author ghp
     * @date 2022/10/14
     * @title 测试类1
     * @description 用于模拟不使用外观模式
     */
    public class Test1 {
        public static void main(String[] args) {
            //模拟开机
            CPU cpu = new CPU();
            cpu.run();
    
            HardDisk hardDisk = new HardDisk();
            hardDisk.read();
    
            Memory memory = new Memory();
            memory.check();
    
            OS os = new OS();
            os.load();
        }
    }
    

csdn

🌲总结

  • 总的来讲外观模式的核心就是:将复杂的东西变得简单

    这里的复杂的东西从本个小案例是无法看出来的, 在实际开发中一般会是一堆复杂交错的子系统,并且外观模式的设计也是相当复杂的,从这个案例可能只是窥探其冰山一角,真真想要掌握,往往需要大量的开发经验,这篇文章也是博主首次探索外观模式,期待大家的关注,后续将持续更新设计模式相关内容,往后也会发布设计模式的深度思考和总结性的文章

  • 与外观者模式相关的其它设计模式

    • Singleton模式:有时会使用Singleton模式创建Facade角色
    • Abstract Factory模式:可以将Abstract Factory模式看作生成复杂实例时的Facade模式。因为它提供了“要想生成这个实例只需要调用这个方法就OK了”的简单接口
    • Mediator模式:在Facade模式中,Facade角色单方面地使用其他角色来提供高层接口(API)。而在Mediator模式中,Mediator角色作为Colleague角色间的仲裁者负责调停。可以说,Facade模式是单向的,而Mediator角色是双向的

自此,文章就结束了,如果觉得本文对你有一丢丢帮助的话😄,欢迎点赞👍+评论✍,您的支持将是我写出更加优秀文章的动力O(∩_∩)O

谢谢1


上一篇:每日一个设计模式之【装饰模式】

下一篇:每日一个设计模式之【享元模式】

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

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

相关文章

【c++】四种类型转换的用法

这里写目录标题static_cast 无条件转换,静态类型转换const_cast 去掉类型的const或volatile属性dynamic_cast 有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL)reinterpret_cast 仅重新解释类型&#xf…

离散数学(十二):关系的幂运算与关系的性质

1 关系的幂运算 1)幂运算的定义 2)幂运算的求法 幂运算有两种求法,基于矩阵的方法和基于关系图的方法。我们之前学过关系的表示方法有三种:集合、矩阵、关系图。那么同样,这些方式也可以运用于关系的计算中。 需…

leaflet教程029: 加载KML文件(代码示例)

第029个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载kml文件,将图形显示在地图上。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式安装leaflet-plugins本示例引用的kml文件代码示例源代码(共79行)专栏目标…

【容器网络】跨主通信网络实现方法之host-gw实现原理

以上是VXLAN在跨主通信的实现原理,本文讲述的是host-gw的实现原理。 目录 Host-gw 基本原理 flannel的host-gw 数据包传输过程 calico的host-gw calico架构 BGP Peer Node-to-NodeMesh Route Reflector IPIP Host-gw 在容器生态中,提供 Host-gw解决方案…

Seata AT模式TransactionHook会被莫名删除?

前言 兄弟们,刚刚又给seata社区修了一个BUG,有用户提了issue反应TransactionHook在某些情况下不会被调用: 该用户在issue中已经指出了相关问题所在: 下面我们来看一下到底是什么原因导致了上述BUG的产生。 问题定位 根据用户的…

最新JMeter面试题,紧扣面试实际要求,看完拿下20K

JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是测试人员必须要掌握的工具之一。 下面小编给大家总结了22年最新30道关于JMeter的面试题,…

基于51单片机的温度报警系统

功能: 设计一个温度报警系统,可以设定温度上、下限的值,到达设定值时,蜂鸣器响;按键设定有设置、确定、取消、减少与增加功能,LCD1602实时显示相关温度信息 设定界面: 温度超过设定值&#xf…

美国能源部国家实验室将量子计算用于关键能源研究

​ (图片来源:网络) 量子计算是一种新兴的、强大而有前途的且能快速解决复杂问题的新力量,美国能源部国家实验室NETL的专家正准备将量子计算投入到关键能源的研究课题上,以实现环境可持续和能源应用的无限未来。 量子…

【MySQL | 运维篇】05、MySQL 分库分表之 使用 MyCat 分片

目录 一、垂直拆分 1.1 场景 1.2 准备 1.3 配置 1). schema.xml 2). server.xml 1.4 测试 1). 上传测试SQL脚本到服务器的 /root/sql 目录 2). 执行指令导入测试数据 3). 查询用户的收件人及收件人地址信息(包含省、市、区)。 4). 查询每一笔订单及订单的收件地址信息…

html页面广告5秒之后跳过

首页 - <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width; in…

【51】分布式计算:如果所有人的大脑都联网会怎样?

【计算机组成原理】学习笔记——总目录 【51】分布式计算&#xff1a;如果所有人的大脑都联网会怎样&#xff1f;引言一、从硬件升级到水平扩展二、理解高可用性和单点故障三、总结【个人总结的重点】引言 现在我们每天在用的个人 PC、智能手机&#xff0c;乃至云上的服务器&a…

Nginx反向代理配置

关键字&#xff1a; 反向代理&#xff0c;负载均衡 第一步&#xff1a;官网下载windwos版本nginx 下载地址链接:nginx: download 如下图所示 第二步&#xff1a;解压启动nginx 备注&#xff1a;启动前先查看进程是否占用 80端口 netstat ano | findstr 80tasklist |findstr “…

linux下Nerdtree安装方法

目录 1.下载Nerdtree 2. linux下安装 3. 成功享受吧 1.下载Nerdtree 百度网盘下载&#xff0c;地址为链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;07e3 --来自百度网盘超级会员V4的分享 github方式下载&#xff0c;地址为 https://github.com/scrooloose/ner…

【附源码】Python计算机毕业设计蔬果批发网络平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

HECTF2022 学习笔记

HECTF2022 MISC笔记 目录HECTF2022 MISC笔记小鲨鱼来喽~舞者的秘密你把我的flag藏哪去了。。小鲨鱼来喽~ 查看最后面的http数据包&#xff0c;发现flag 舞者的秘密 先爆破出压缩包密码&#xff0c;用010打开&#xff0c;发现文件开头是gif的格式 将图片格式改为gif&#xf…

Mysql之常用函数、聚合函数合并(unionunion all)【第四篇】

大纲&#xff1a; 1、函数的简介 MySQL函数是 MySQL 数据库提供的内部函数&#xff0c;这些内部函数可以帮助用户更加方便地处理表中的数据。函数就像预定的公式一样存放在数据库里&#xff0c;每个用户都可以调用已经存在的函数来完成某些功能。 简单来说&#xff0c;函数就是…

Sublime Text v4.0(4143)破解方法

[TOC](Sublime Text v4.0(4143)破解方法) 版本Sublime Text v4.0(4143) 所需软件 Sublime Text v4.0(4143)下载地址&#xff1a;https://www.sublimetext.com/download_thanks?targetwin-x64 010 Editor下载地址(其他十六进制编辑器也可以) https://download.sweetscape.co…

基于ISO13209(OTX)实现EOL下线序列

一 OTX是什么&#xff1f; OTX&#xff0c;全称Open Test sequence eXchange format&#xff0c;即开放式测试序列交换格式&#xff0c;国际标准&#xff1a;ISO13209&#xff0c;是专为汽车行业制定的序列开发标准。在车辆诊断、自动化标定和ECU测试等领域有广泛应用。OTX不仅…

使用Jmeter进行性能测试的操作方法

前言 JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c; 下载地址&#xff1a; Apache JMeter - Download Apache JMeter 下载好之后 &#xff0c;他得需要 jdk配置 好环境变量 才能运行。 这是很重要的一点&#xff0c; 。 安装 一系…

高数 |【23数一 李林六套卷】卷二 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷二】 以下均为个人复盘。 部分思路讲解参考于 6-2_哔哩哔哩_bilibili 第二套T22_哔哩哔哩_bilibili T1:泰勒 ※ T2:高阶导 想泰勒展开 或 本题画图 法一:泰勒 法二:画图