设计模式——门面模式

news2024/10/7 6:45:36

门面模式

定义

门面模式(Façade Pattern)又称为外观模式,是一种比较常用的封装模式。
要求一个子系统的外部与其内部的通信通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用

优缺点、应用场景

优点

  1. 减少系统的相互依赖。假设非门面模式,外部系统可以直接深入子系统,之间产生强耦合关系,不符合低耦合的思想。而门面模式可以让门面对象对接外部系统,而无关子系统。
  2. 提高灵活性。无论子系统怎么变化,门面都是独立的。
  3. 提高安全性。外部系统只能访问门面提供的方法,不会直接对接子系统。

缺点

不符合开闭原则,对修改关闭、对拓展开放,一旦门面对象出现问题,只能修改门面对象的代码,风险相当大,设计时需要慎重考虑

应用场景

  1. 为一个复杂的模块或子系统提供一个供外界访问的接口
  2. 子系统相对独立,外界不关心子系统的实现
  3. 降低低水平开发人员带来的风险。可以指定其只能在子系统中开发,再通过门面接口进行操作

代码场景模拟

信件邮递,没有门面服务时只能自己做,使用门面模式添加一个邮局对象只需要必要信息就可以邮递,之后还可以引入检查对象对邮件信息进行检查

门面模式

UML图

在这里插入图片描述

写邮件需求的接口与实现

/**
 * 写信告诉我今夜你想要梦什么
 */
public interface ILetterProcess {
	/**
	 * 写信的内容
	 *
	 * @param context 信的内容
	 */
	void writeContext(String context);

	/**
	 * 写信的信封
	 *
	 * @param address 地址
	 */
	void fillEnvelope(String address);

	/**
	 * 把信放入信箱
	 */
	void letterIntoEnvelope();

	/**
	 * 邮递
	 */
	void sendLetter();

}

public class LetterProcessImpl implements ILetterProcess {
	@Override
	public void writeContext(String context) {
		System.out.println("写信的内容:" + context + "...");
	}

	@Override
	public void fillEnvelope(String address) {
		System.out.println("填写收件人姓名和地址:" + address + "...");
	}

	@Override
	public void letterIntoEnvelope() {
		System.out.println("把信放入信封中...");
	}

	@Override
	public void sendLetter() {
		System.out.println("邮递信件...");
	}
}

门面对象——邮局

/**
 * 暗黑功德箱邮局
 */
public class DarkMeritPostOffice {
	private final ILetterProcess letterProcess = new LetterProcessImpl();
	private final Police police = new Police();

	/**
	 * 只获取写信人的必要信息
	 *
	 * @param context 信的内容
	 * @param address 收件人地址
	 */
	public void sendLetter(String context, String address) {
		System.out.println("***** 暗黑功德箱邮箱让寄信更简单 *****");
		// 开始写信
		letterProcess.writeContext("Do you like what you see?");
		// 写信封
		letterProcess.fillEnvelope("Boy next door.");
		// 信件检查
		police.checkLetter(letterProcess);
		// 把信封放到信封内,封装
		letterProcess.letterIntoEnvelope();
		// 投递信件给邮局
		letterProcess.sendLetter();
	}
}

检查对象——拓展门面的功能

/**
 * 信件检查类
 */
public class Police {
	/**
	 * 信件检查
	 *
	 * @param letterProcess 被检查的信件
	 */
	public void checkLetter(ILetterProcess letterProcess) {
		System.out.println(letterProcess + " 已经检查过了...");
	}
}

入口类

public class FacadePatternMain {
	public static void main(String[] args) {
//        originWriteLetter();
		facadeWriteLetter();
	}

	/**
	 * 使用门面对象帮忙完成邮递过程
	 */
	private static void facadeWriteLetter() {
		// 暗黑功德箱邮局,为你发送邮件
		DarkMeritPostOffice darkMeritPostOffice = new DarkMeritPostOffice();
		// 信的内容
		String context = "Do you like what you see?";
		// 收件人地址
		String address = "Next door.";
		darkMeritPostOffice.sendLetter(context, address);
	}

	/**
	 * 一般的写信流程
	 */
	private static void originWriteLetter() {
		ILetterProcess letterProcess = new LetterProcessImpl();
		// 开始写信
		letterProcess.writeContext("Do you like what you see?");
		// 写信封
		letterProcess.fillEnvelope("Next door.");
		// 把信封放到信封内,封装
		letterProcess.letterIntoEnvelope();
		// 投递信件给邮局
		letterProcess.sendLetter();
	}
}

结果

非门面模式
在这里插入图片描述

门面模式在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

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

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

相关文章

关于VUE报错“TypeError: Converting circular structure to JSON“

关于VUE报错“TypeError: Converting circular structure to JSON" 问题: [Vue warn]: Error in nextTick: "TypeError: Converting circular structure to JSON--> starting at object with constructor Vue| property $options -> object wit…

Linux驱动进阶(二)——设备驱动中的阻塞和同步机制

文章目录 前言阻塞与非阻塞等待队列等待队列概述等待队列的实现等待队列的使用 同步机制实验同步机制设计实验验证 小结 前言 阻塞和非阻塞是设备访问的两种基本方式。使用这两种方式,驱动程序可以灵活地支持阻塞与非阻塞访问。在写阻塞与非阻塞的驱动程序时&#…

喜报!Coremail连续4届入选嘶吼网络安全产业图谱

7月10日,嘶吼安全产业研究院联合国家网络安全产业园区(通州园)正式发布《嘶吼2023网络安全产业图谱》(以下简称“图谱”)。 Coremail成功入选本次图谱五大分类下14个细分领域,分别是安全自动化/协作&#x…

linux中数据库表相关查询

目录 1.显示所有职工的基本信息 2.查询所有职工所属部门的部门号,不显示重复的部门号 3.求出所有职工的人数 4.列出最高工资和最低工资 5.列出职工的平均工资和总工资 6.创建一个只有职工号,姓名和参加工作的新表,名为工作日期表 7、显示所…

GPT(Generative Pre-Training)论文解读及实现(一)

1 GPT Framework 1.1 Unsupervised pre-training Given an unsupervised corpus of tokens U {u1, . . . , un}, we use a standard language modeling objective to maximize the following likelihood: 在给定语料上下文环境下,目标时最大化下面的语言模型&…

Java8 Stream 使用详解

Java8 Stream 使用详解 一、流的定义二、流的创建1. 通过集合创建流:2. 通过数组创建流:3. 通过Stream.of()创建流:4. 通过Stream.generate()创建流:5. 通过Stream.iterate()创建流:6. 通过文件、网络、IO流等方式来创…

Effective Java 高效编码阅读 笔记

《Effective Java》 有关于 Java 变成编程性能优化的 的书籍,看了不计其数 ,但是每当读起来能让我眼前一亮的还得是 Effective Java 像这一类的书籍还有很多例如下面的 的两本,今天呢,来记录下此书的阅读笔记方便日后记忆&#xf…

【面试题34】什么是MVC,为什么要使用它

文章目录 一、前言二、MVC介绍2.1 模型(Model)2.2 视图(View)2.3 控制器(Controller) 三、MVC模式的优点四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域…

深入了解Spring Cloud的服务注册与发现组件Eureka

摘要:Spring Cloud是一个基于Spring框架的开发工具包,可以帮助开发人员构建基于微服务架构的分布式系统。其中的核心组件之一是Eureka,它提供了一套强大的服务注册与发现功能。本文将深入介绍Spring Cloud中的Eureka组件,包括其背…

MIT 6.S081 -- Networking

MIT 6.S081 -- Networking 引言计算机网络概述二层网络 --- Ethernet二/三层地址转换 --- ARP三层网络 --- Internet四层网络 --- UDP网络协议栈(Network Stack)Ring BufferReceive Livelock如何解决Livelock 引言 本文整理至: MIT 6.S081 2020 操作系统…

回归预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介…

nginx高并发架构

1.前言 对于高并发的流量web架构,单纯的使用nginx是不够用的,nginx做七层代理需要处理数据,在大并发的情况下对主机资源的消耗就非常厉害了,所以此情况下就引入了lvs,使用lvs的四层转发功能,四层转发不需要…

【MySQL】如何优化SQL查询的总体框架(详细版,关于如何优化数据库服务器从大到小详细说明了步骤)

文章目录 1 数据库服务器的优化步骤2 观察2.1 观察系统总体运行情况2.2 定位执行慢的 SQL:慢查询日志2.3 查看 SQL 执行成本:SHOW PROFILE2.4 分析查询语句:EXPLAIN(重点掌握)2.4.1 EXPLAIN各列作用2.4.2 EXPLAIN 的 t…

银行安全用电监管平台可行性研究及解决方案

2017年4月26日,国务院安全生产委员会印发《国务院安全生产委员会关于开展电气火灾综合治理工作的通知》(安委〔2017〕4号),强调用三年时间综合治理电气火灾工作,提高社会单位发现和处置消防电气安全隐患能力&#xff0…

2023国自然会评:上会及分数解析,这几种情况本子容易被拿下?

国自然基金上会标准 今年的会评已经临近“重头戏”---面青地项目会议评审。 在国自然会评中,通过函评筛选出的科研工作者,经过会评筛选和评审,最终被评选出的项目将获得国自然会的资金支持。 国自然的会评,分为几个部分&#x…

美国访问学者怎么考驾照?

作为一个美国访问学者,你可能会想知道在美国如何考取驾照。在这篇文章中,知识人网小编将介绍美国的驾照考试流程和一些相关要求。 首先,作为一名访问学者,你需要了解美国各州对驾照的规定可能会有所不同。因此,在考取驾…

单片机尽力少用位域操作

1、在51单片机中少用uint32_t类型,查看汇编真的好多条指令,尽力避免少用。 2、在32位单片机中,u8、u16、u32类型操作起来基本没有什么影响,下图是我做的测试,可能测试不全面,按照当前测试,在32…

CVE-2023-28432-MinIO集群模式信息泄露漏洞流量分析

简介 MinIO是一个开源对象存储系统。 在其RELEASE.2023-03-20T20-16-18Z版本(不含)以前,集群模式部署下存在一处信息泄露漏洞,攻击者可以通过发送一个POST数据包获取进程所有的环境变量,其中就包含账号密码MINIO_SEC…

ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用

0. 前言 终于!终于!自个翻遍了网上的文章,加上对官网的文档和API的翻找,终于明白这玩意到底更新出了个啥出来! 本文章会带你了解,使用 SpringDataES5.1 对 ES8.7 的【新增、修改、删除、多条件查询、聚合】…

MFC 工具栏中的按钮控件下拉式

有一个需求 工具栏中的按钮需要有一个下拉按钮,点击下拉按钮可以弹出一个子窗口来选择 显示该 TBSTYLE_EX_DRAWDDARROWS 扩展的样式设置,将箭头下方将显示。 DWORD dwExStyle TBSTYLE_EX_DRAWDDARROWS; m_toolbar.GetToolBarCtrl().SendMessage(TB_SE…