门面(外观)模式

简介

门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。

通用模板

  1. 创建子系统角色类:可以同时有一个或多个SubSystem。每个SubSytem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade 只是另一个客户端而已(即Facade对SubSystem透明)。

    
    // 子系统A
    public class SubSystemA {public void doA(){System.out.println("子系统A处理一些事情...");}
    }
    
    // 子系统B
    public class SubSystemB {public void doB(){System.out.println("子系统B处理一些事情...");}
    }
    
  2. 创建门面角色类:是系统对外的统一接口。

    
    // 门面类
    public class Facade {private SubSystemA a = new SubSystemA();private SubSystemB b = new SubSystemB();// 对外接口public void doA(){a.doA();}// 对外接口public void doB(){b.doB();}
    }

模板测试

  1. 代码

    
    public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.doA();facade.doB();}
    }
    
  2. 结果

    子系统A处理一些事情...
    子系统B处理一些事情...
    

应用场景

在日常生活中,门面模式也是很常见的。比如,我们去医院就诊,很多医院都设置了导诊台,这个导诊台就好比一个门面。有了这个导诊台,我们全程就诊都不需要到处乱转,就诊路线变得非常清楚。再比如,现在中国就要全面进入小康社会,很多农村家家户户都建起了小别墅。那么,建别墅也是一项很复杂的工程。在以前,都是相互帮忙把房子建起来,但是建别墅一般要找一个承建方,负责设计、施工等。我们通常说的包工头其实就是一个门面,在施工过程中有任何需要协调对接的找包工头就可以了。 在软件系统中,门面模式适用于以下应用场景。
(1)为一个复杂的模块或子系统提供一个简洁的供外界访问的接口。
(2)希望提高子系统的独立性时。
(3)当子系统由于不可避免的暂时原因导致可能存在Bug或性能相关问题时,可以通过门面模式提供一个高层接口,隔离客户端与子系统的直接交互,预防代码污染。

优点

(1)简化了调用过程,不用深入了解子系统,以防给子系统带来风险。
(2)减少系统依赖,松散耦合。
(3)更好地划分访问层次,提高了安全性。
(4)遵循迪米特法则。

缺点

(1)当增加子系统和扩展子系统行为时,可能容易带来未知风险。
(2)不符合开闭原则。
(3)某些情况下,可能违背单一职责原则。

“生搬硬套”实战

场景描述

我们以注册公司为例,假设注册公司需要三步:

  1. 向工商局申请公司营业执照;
  2. 在银行开设账户;
  3. 在税务局开设纳税号。

现在各地政府都有政务大厅,再也不用去各个地方跑去问怎么处理,直接通过政务大厅就一次性办理了。

代码开发
  1. 创建子系统角色(这里指的是工商注册、银行开户、纳税登记)类

    // 工商注册
    public class AdminOfIndustry {public void register() {System.out.println("工商注册");}
    }
    
    
    // 银行开户
    public class Bank {public void openAccount() {System.out.println("银行开账户");}
    }
    
    // 纳税登记
    public class Taxation {public void applyTaxCode() {System.out.println("纳税登记");}
    }
    
    1. 创建门面角色(这里指的是政务大厅)类
    
    public class Facade {private AdminOfIndustry adminOfIndustry = new AdminOfIndustry();private Bank bank = new Bank();private Taxation taxation = new Taxation();public void register(){adminOfIndustry.register();}public void openAccount(){bank.openAccount();}public void applyTaxCode(){taxation.applyTaxCode();}
    }
    

至此,我们就通过“生搬硬套”门面模式的模板设计出一套通过门面就可以处理所有子系统的业务了,接下来我们进行测试:

  • 测试代码

    
    public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.register();facade.openAccount();facade.applyTaxCode();}
    }
    
  • 结果

    工商注册
    银行开账户
    纳税登记
    

总结

在日常编码工作中,我们都在有意无意地大量使用门面模式。但凡只要高层模块需要调度多个子系统(2个以上类对象),我们都会自觉地创建一个新类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方SDK、开源类库,很大概率都会使用门面模式。大家觉得调用方便的,一般门面模式使用得更多。

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

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

相关文章

【AI基础】pytorch lightning 基础学习

传统pytorch工作流是首先定义模型框架,然后写训练和验证,测试循环代码。训练,验证,测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型,加速模型训练和验证,记录。 准备工作 1 安装pytorch…

JAVA红娘婚恋相亲交友系统源码全面解析

在数字化时代,红娘婚恋相亲交友系统成为了连接单身男女的重要桥梁。JAVA作为一种流行的编程语言,为开发这样的系统提供了强大的支持。编辑h17711347205以下是对JAVA红娘婚恋相亲交友系统源码的全面解析,以及三段示例代码的展示。 系统概述 …

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求:仅根据某一属性,分割图层,并以属性值命名图层名保存。 众所周知,ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层,以属性值命名图层,如下图所示。 本功能仅依据属性值,将一个shp图…

转行大模型的必要性与未来前景:迎接智能时代的浪潮

随着人工智能(AI)技术的迅猛发展,特别是大型语言模型(LLM, Large Language Models)的崛起,各行各业正迎来一场前所未有的技术革命。对于普通程序员而言,转行进入大模型领域不仅是对个人职业发展…

【第十五章:Sentosa_DSML社区版-机器学习之关联规则】

目录 15.1 频繁模式增长 15.2 PrefixSpan 【第十五章:Sentosa_DSML社区版-机器学习之关联规则】 机器学习关联规则是一种用于发现数据集中项之间有趣关系的方法。它基于统计和概率理论,通过分析大量数据来识别项之间的频繁共现模式。 15.1 频繁模式增…

Python 爬虫 根据ID获得UP视频信息

思路: 用selenium库对网页进行获取,然后用bs4进行分析,拿到bv号,标题,封面,时长,播放量,发布时间 先启动webdriver.,进入网页之后,先等几秒,等加…

Unity 的Event的Use()方法

对于Event的Use方法,其在调用后将不会再判断同类型的事件 这种情况下,第二个MosueDown不会进入,因为已经Use 如果把Use注释掉 依旧能进入第二个MosueDown 也就是说当使用了Use方法,相同的事件类型不会进第二遍

【反素数】

题目 思路 首先分析 的性质 一定是 中约数最大的一定是约数同是最大的数字中值中最小的进一步挖掘性质,紧贴枚举的做法 约数最大值最小(也决定了层数、其它约束),是枚举的比较条件实现上述目的,枚举的质数种类在大小…

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…

VS Code breadcrumbs view 是什么

VS Code breadcrumbs view 是什么 正文 正文 breadcrumbs view:中文翻译,面包屑视图,乍听起来感觉十分抽象。这里我们来解释一下这个视图的含义? 如下图所示,红色框标记的部分就是 这个视图可以显示出当前打卡文件所…

新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?

很多初学者想要涉足嵌入式Linux开发领域,但往往在刚入门阶段,会因为初次接触到大量复杂的概念术语和深奥的技术文档感到压力重重,面对这些内容不知从何下手,感到十分迷茫,网上的内容也纷繁复杂,没有清晰的学…

从 Kafka 到 WarpStream: 用 MinIO 简化数据流

虽然 Apache Kafka 长期以来一直是流数据的行业标准,但新的创新替代方案正在重塑生态系统。其中之一是 WarpStream,它最近在 Confluent 的所有权下进入了新的篇章。此次收购进一步增强了 WarpStream 提供高性能、云原生数据流的能力,巩固了其…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章:SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例: 我们都知道自…

2024双十一买啥最划算?2024双十一五款值得入手的好物入手

2024双十一购物狂欢节将至,还在为买什么而纠结吗?这里为你入手五款值得入手的好物。从生活必备到时尚单品,涵盖多个领域,让你在双十一以划算的价格买到心仪之物,开启品质生活新旅程。 一、西圣find可视挖耳勺 入手理…

毕业设计选题:基于ssm+vue+uniapp的校园订餐小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

【补充】倒易点阵定义

晶体点阵:晶体内部结构在三维空间周期平移的客观存在的数学抽象,反映晶体实际原子排列。 倒易点阵:通过对晶体的正点阵进行傅里叶变换得到的,其中正点阵中每个阵点的位置矢量方向代表晶面族的法向,位置矢量的长度是晶…

CSS04-Chrome调试工具

Chrome 浏览器提供了一个非常好用的调试工具,可以用来调试我们的 HTML结构和 CSS 样式。

我们是向量数据库的领军企业,我们只招TOP人才

我们是全球领先的向量数据库企业,业务正在快速发展,现开放大量岗位: 前端、产品经理、数据库开发工程师、C、数据库运维、数据库测试…… 我们招聘的唯一目标,寻找 TOP人才! 如果你已经有丰富的经验,那么加…

jmeter-请求参数加密-MD5加密

方法1 :使用jmeter自带的函数助手digest Tool(工具)---Function Helper Dialog(函数助手对话框) 第一个参数是要md5加密的值,第二个参数是保存加密后值的变量 ( 此处变量是从txt文件导入的,所以使用的是${wd} ) …