设计模式-外观模式

news2024/11/23 12:28:25

前言

在聊外观模式之前,我们先来聊聊体检过程。一般体检过程就是我们根据网上预定得日期空腹去体检中心。根据预定得项目,有一般检查、内科、外科、眼科、彩超、心电图、血常规、尿常规等等项目。

而我们往往第一次去是不知道这些房间是在哪里的,所以,我们一般会去求助现场得接待人员,通过它分别找到我们得体检目标具体位置,这一过程可以看做外观模式也称门面模式

专业定义

它是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。又名门面模式,是一种通过为多个复杂得子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性

案例

现在,我们定义三个体验项目(内科、外科、眼科),和一个接待人员,一个测试类。

public class Receptionist {
    private InternalMedicine inner;
    private Ophthalmology eye;
    private Surgical out;

    public Receptionist() {
        inner = new InternalMedicine();
        eye = new Ophthalmology();
        out = new Surgical();
    }

    public void say(String message) {
        if ("我要体验".equals(message)) {
            this.goHere();
        }
    }

    public void goHere() {
        System.out.println("欢迎来到我们体验中心!!!体验项目在那,去吧~");
        inner.here();
        eye.here();
        out.here();
    }

    public static void main(String[] args) {
        Receptionist receptionist = new Receptionist();
        receptionist.say("我要体验");
    }
}

// 内科
class InternalMedicine {
    public void here() {
        System.out.println("内科未见异常");
    }
}

// 眼科
class Ophthalmology {
    public void here() {
        System.out.println("眼科注意保养");
    }
}

// 外科
class Surgical {
    public void here() {
        System.out.println("外科未见异常");
    }
}

输出结果:
在这里插入图片描述

模式分析

优缺点

优点
  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类,你可以让自己的代码独立于复杂子系统;
缺点
  • 不符合开闭原则,所有类都耦合在一起,修改很麻烦;

使用场景

  • 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且,用户也可以越过外观类直接访问子系统;
  • 引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性;
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入门,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度

需要注意的点

  • 一个系统有多个外观类
    在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,换言之,它是一个单例类。在很多情况下为了节约系统资源,一般将外观类设计为单例类。当然这并不意味着在整个系统里只能有一个外观类,在一个系统中可以设计多个外观类,每个外观类都负责和一些特定的子系统交互,向用户提供相应的业务功能。
  • 不要试图通过外观类为子系统增加新行为
    不要通过继承一个外观类在子系统中加入新的行为,这种做法是错误的。外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统或增加新的子系统来实现,不能通过外观类来实现。
  • 外观模式与迪米特法则
    外观模式创造出一个外观对象,将客户端所涉及的属于一个子系统的协作伙伴的数量减到最少,使得客户端与子系统内部的对象的相互作用被外观对象所取代。外观类充当了客户类与子系统类之间的“第三者”,降低了客户类与子系统类之间的耦合度,外观模式就是实现代码重构以便达到”迪米特法则“要求的一个强有力的武器
  • 抽象外观类的引入
    外观模式最大的缺点在于违背了”开闭原则“,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程。对于新的业务需求,不修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到不修改源代码并更换外观类的目的。

小结

外观模式比较简单理解,它通过与门面打交道,避免了与下面各个复杂子系统的操作,从而达到简化系统的目的,让这个复杂的系统变得容易使用。如果能够合理的使用外观模式,可以帮助我们更好的划分访问的层次,隐藏一些复杂细节到子系统,留个简单粗暴的接口给外观展示,外观模式,就这么简单!

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

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

相关文章

XenServer7.6安装教程

XenServer7.6安装安装步骤其他XenServer 7.0 系统 yum 出错解决办法XenServer其他部署问题安装步骤 进入系统启动界面 > 按回车,等待加载: 1、键盘布局选择 > 选择us: 2、欢迎界面 > 选择ok: 3、用户协议 > 选…

【大数据入门核心技术-Flume】(三)使用Flume采集数据到HDFS

目录 一、准备工作 1、Hadoop环境安装 2、Flume安装部署 二、采集数据到HDFS 1、配置任务文件 2、启动传输 3、查看是否同步成功 三、常见问题 1、运行flume-ng agent时报错com.google.common.base.Preconditions.checkArgument 2、ERR: File name has been re-used w…

tomcat配置https

tomcat配置前提需要开放需要配置端口,尤其是云服务器需要单独去提供商控制面板放行好再进行配置HTTPS,常见配置的端口:443、8443,另外配置过程如果项目正常运行,建议备份一份配置文件。 tomcat配置https步骤 一、我们…

EEMD(集合经验模态分解)

1. EEMD(集合经验模态分解)的概念 EEMD(Ensemble Empirical Mode Decomposition)是最常见的一种EMD改进方法。他的优势主要是解决EMD方法中的模态混叠现象。 说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中…

更多自有品牌创新好物,尽在2023深圳国际自有品牌展暨新消品展

受整体环境的影响,以及内容购物、兴趣电商、O2O、团长等新消费方式崛起,传统商场、大卖场等实体零售市场发展呈下滑趋势。让零售行业可以重拾信心,迫切需要寻找新的业绩突破形式。这些年自有品牌,被越来越多的国内零售商所关注&am…

BL101助力于采集光伏电流电压

能源危机在世界范围内愈演愈烈, 俄乌冲突后,美国加大对俄罗斯能源的制裁力度,禁止从俄罗斯进口能源,也想办法让其欧洲盟友对俄罗斯进行抵制。导致油价高企,天然气价格也是一路飙升。各国都在发展新能源,风电…

【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

只要浏览器播放视频时用的是<video>&#xff0c;而且当前页面只有这一个视频&#xff0c;就可以用这个脚本。 刚好也是世界杯 CSDN 博客的活动了&#xff0c;虽然对活动没什么兴趣但是还是写一句和活动相关的话吧——世界杯为什么要看直播呢&#xff01;不如一起来倍速观…

ssm+Vue计算机毕业设计校园洗衣机预约系统(程序+LW文档)

ssmVue计算机毕业设计校园洗衣机预约系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

Linux内存查看通用方法(二): kernel空间

接上文&#xff1a; Linux内存查看通用方法&#xff08;一&#xff09;&#xff1a; user空间_红桃Jk的博客-CSDN博客_linux内存查看在嵌入式linux上&#xff0c;统计内存情况的一般方法https://blog.csdn.net/qq_34597963/article/details/126023451?spm1001.2014.3001.5501…

用 CSS 从零写一个时间轴效果

时间轴效果介绍 在前端开发中&#xff0c;我们会遇到一些场景特别适合用时间轴来展示&#xff0c;例如下面按照日期时间来记录发生的事件&#xff1a; 还可以做成下面这种比较流行的左右对称卡片风格的时间轴&#xff1a; 如果再稍加装饰&#xff0c;还能有更加高大上的效果&a…

跨域的部分理解

1、跨域的原理 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。 同源策略&#xff0c;是浏览器对 JavaScript 实施的安全限制&#xff0c;只要协议、域名、端口有任何一个不同&#xff0c;都被当作是不同的域。 跨域原理&#xff0c;即是通…

量子计算(十四):超导量子芯片

文章目录 超导量子芯片 超导量子芯片 超导量子计算是基于超导电路的量子计算方案&#xff0c;其核心器件是超导约瑟夫森结。超导量子电路在设计、制备和测量等方面&#xff0c;与现有的集成电路技术具有较高的兼容性&#xff0c;对量子比特的能级与耦合可以实现非常灵活的设计…

node.js按照和配置环境变量

下载地址 选择自己适合的版本 Download | Node.js 安装 傻瓜式安装就好了 安装完成后 查看是否安装成功 打开黑窗口 node -v npm -v 配置全局安装的模块路径和缓存路径 在nodejs根目录,创建node_global&#xff0c;node_cache文件夹 命令提示符 以管理员方式运行 我的目…

基于springboot疫情防控期间某村外出务工人员信息管理系统设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期…

Oracle建表与创建序列

目录 一、简单建表 二、查看表结构(在Xshell中输入才能够执行) 三、设置自增序列 (一)普通自增序列 1.创建序列&#xff0c;oracle中没有自增&#xff0c;创建序列相当于等差数列自增 2.删除序列 3.建表的同时设置主键自增的步骤 (二)复杂序列 1.复杂序列模板 2.复杂…

架构设计(二):数据库复制

架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 CSDN&#xff1a;架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 在架…

100-数据结构与算法(下篇)

现在我们续写上一章博客的内容&#xff08;即99章博客的内容&#xff09; 快速排序&#xff1a; 同冒泡排序一样&#xff0c;快速排序也属于交换排序&#xff0c;通过元素之间的比较和交换位置来达到排序的目的 不同的是&#xff0c;冒泡排序在每一轮中只把1个元素冒泡到数列…

彻底搞懂JavaScript防抖与节流

今天为大家带来一篇JS重难点的知识体系&#xff0c;这也是前端高薪必备的重难点知识&#xff0c;而且防抖与节流在各大企业前端面试过程中经常会考到的高频面试题&#xff01; 为了更好的帮助大家理解防抖与节流&#xff0c;我们特意从我们的系统班&#xff08;星辰班&#xff…

[阶段4 企业开发进阶] 6. Dubbo

文章目录1 基础理论1.1分布式基础理论1.2 发展演变1.3 RPC2 Dubbo2.1 基本概念2.2 Dubbo架构2.3 环境搭建Windows环境安装教程Linux环境安装教程3 案例演示3.1 需求分析3.2 工程架构分包粒度3.3 创建模块3.4 使用Dubbo配置版注解版4 监控中心4.1 安装4.2 监控中心配置5 整合Spr…

Java中的成员内部类

一、什么是成员内部类 成员内部类就是定义在外部类成员位置(属性/方法的位置)的类。成员内部类就是个成员。 二、为什么要有成员内部类 使用场景&#xff1a;除了它的外部类&#xff0c;不会被其他类使用&#xff0c;就可以使用成员内部类。有两种情况&#xff1a;1.不可能有…