设计模式详解(八):外观模式——Facade

目录导航

  • 什么是外观模式
  • 现实生活类比
  • 实战示例
  • 门面模式的好处
  • 门面模式源码举例

什么是外观模式

外观模式的英文名是Facade,意思是the front of a building,即建筑物的正面(门面),我个人更喜欢翻译成门面模式。门面模式是一种结构型设计模式,所谓结构型是指在代码结构设计方面的设计模式。

门面模式是一个类或一个模块统一的功能入口,屏蔽掉系统内部的实现及运作方式,客户端通过门面与系统交互,大大降低使用的复杂度,减少与系统的耦合。

现实生活类比

在一家餐馆中,顾客可能需要各种服务。如:点餐、买单、询问卫生间、需要卫生纸、临时添加碗筷等等。如果每种服务都要到餐馆不同的服务点找不同的人解决,顾客会疯掉。而前台就是整个餐馆的门面,是餐馆所有功能的输出口,顾客通过前台与餐馆沟通,享受各种服务,而不用关心前台将会对此事如何安排(具体指派何人,以何种方式满足顾客要求等)。

实战示例

假如,我们要开发上述的餐馆功能。
初始阶段,业务相对简单,我们只有点餐与买单的功能。新建一个OrderManager类,

public class OrderManager {//点餐public void order(int tableNo) {System.out.println("table " + tableNo + " has ordered");}//买单public void bill(int tableNo, double dollars) {System.out.println("table " + tableNo + " bill:" + dollars);}
}

调用方使用该功能,

    public static void main(String[] args) {//创建订单管理模块OrderManager orderManager = new OrderManager();//下单orderManager.order("001");//结账orderManager.bill("001", 350.00);}

随着业务迭代,我们又提供了一些询问服务,置于QueryService中,

public class QueryService {//卫生间在哪里public String whereToilet(){return "it's xxxxx";}//...
}

随着业务的复杂,我们不断加入新的功能置于新的模块。对于餐馆功能的使用方来说,需要记住每个功能模块对应的类,使用复杂度不断攀升。

    public static void main(String[] args) {//创建订单管理模块OrderManager orderManager = new OrderManager();//下单orderManager.order("001");//结账orderManager.bill("001", 350.00);//创建服务问询模块QueryService queryService = new QueryService();//询问厕所queryService.whereToilet();//...}

我们使用门面模式可以解决上述问题。首先,我们创建一个门面类——RestaurantFacade,
此类作为整个餐馆功能入口。

public class RestaurantFacade {private OrderManager orderManager = new OrderManager();private QueryService queryService = new QueryService();//...public OrderManager orderService() {return orderManager;}public QueryService queryService() {return queryService;}//...
}

对于调用方来说,所有的功能我都通过RestaurantFacade一个类获取,不关心也没必要知道其内部的实现和运作方式。
不管该系统后续添加新功能还是删除了旧功能,交互门面不变。

    public static void main(String[] args) {//创建门面类RestaurantFacade facade = new RestaurantFacade();//下单facade.orderService().order("001");//结账facade.orderService().bill("001", 350.00);//询问厕所facade.queryService().whereToilet();//...}

在这里,为了进一步方便管理,我们RestaurantFacade对外提供的功能是返回子模块,然后子模块再调用具体功能。这种通常是在业务十分庞大复杂的情况下采取的策略。你也可以直接对外提供具体的功能,而把模块信息封装在门面类内部。
以点餐为例:

public class RestaurantFacade {private OrderManager orderManager = new OrderManager();//...public void order(String tableNo) {orderManager.order(tableNo);}//...
}

调用方代码:

    public static void main(String[] args) {//创建门面类RestaurantFacade facade = new RestaurantFacade();//下单facade.order("001");//...}

门面模式的好处

外观模式是一种设计模式,旨在简化复杂系统的接口,提供一个更简单的接口来访问系统的子系统集合。它通过将系统的复杂性隐藏在一个单一的接口背后,使得客户端代码更容易使用。以下是外观模式的几个好处:

  • 简化接口: 外观模式提供了一个简化的接口,使得客户端不需要了解系统的复杂性和内部工作原理,只需与外观对象进行交互即可。

  • 降低耦合性: 外观模式有助于降低系统中各个子系统之间的耦合度,因为客户端只需与外观对象交互,而不需要直接与子系统交互,从而减少了对子系统的依赖性。

  • 隐藏实现细节: 外观模式将系统的内部实现细节隐藏在外部,使得系统更易于维护和修改。如果系统的内部实现发生变化,只需更新外观类而不影响客户端代码。

  • 提高易用性: 外观模式使得客户端代码更易于理解和使用,因为它提供了一个简单的接口来访问复杂系统的功能,而无需了解系统的内部复杂性。

  • 促进代码组织和管理: 外观模式可以帮助将系统分解为更小的模块,并将这些模块组织成更易于管理和维护的结构。

总的来说,外观模式通过简化接口、降低耦合性、隐藏实现细节、提高易用性以及促进代码组织和管理等方面,可以帮助提高系统的可维护性、可扩展性和可重用性。

门面模式源码举例

门面模式在第三方类库中非常常见。例如Okhttp,我们使用它的功能,基本都是通过OkHttpClient这个类。

    //创建门面对象,并进行配置OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)//链接超时为2秒,单位为秒.writeTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS)//读取超时.build();//执行一个请求        okHttpClient.newCall(new Request.Builder().url("xxxx").build()).execute();

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

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

相关文章

步进电机噪音大?抖动厉害?-TMC4361步进闭环方案轻松解决

步进电机的闭环控制,实现与伺服电机功能媲美及超越的特点。在电机控制过程中如果想要高效、更高精度以及绝对的可靠性,我们为您推荐在无传感器及将体积做到最小的更高性价比的驱动方案。 我们都知道,在步进电机无反馈时,电机的高…

【刷题(16)】子串

一 子串基础 二 和位K的子数组 1 题目 2 解题思路 前缀和哈希(两数之和) 假如存在区间[left,right],使得在[left,right]这个区间的子数组的和为k。换句话说,就是前right项和减去前left-1项和等于k,即前left-1项和等…

力扣 287. 寻找重复数

给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组 nums 且只用常量…

【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量

目录 一.优化生产流程 1.1 数据收集 1.2 数据预处理 1.3 模型训练 1.4 优化建议 1.5 示例代码 二.预测设备故障 2.1 数据收集 2.2 数据预处理 2.3 模型训练 2.4 故障预测 2.5 示例代码 三.提升产品质量 3.1 数据收集 3.2 数据预处理 3.3 模型训练 3.4 质量提升…

07C回调函数

C零碎语法 目录 文章目录 C零碎语法流程1.声明一个函数指针2.定义回调函数3.注册回调函数 应用4.事件回调5.同步回调函数6.异步回调函数 流程 1.声明一个函数指针 uint8_t (*p_CallbackFunc)(void);2.定义回调函数 重要的是要注意回调函数只是一个函数。 由于它的使用方式(…

Python3基本语法:深度探索与实用指南

Python3基本语法:深度探索与实用指南 在编程的浩瀚星空中,Python3以其独特而强大的语法体系,成为无数开发者的得力助手。本文将从四个方面、五个方面、六个方面和七个方面对Python3的基本语法进行深度剖析,旨在为读者提供一个全面…

前端项目如何排查是否使用第三方.ttf

要在前端项目中排查是否使用了第三方 .ttf 字体文件&#xff0c;可以采取以下步骤&#xff1a; 检查 HTML 和 CSS 文件&#xff1a; 在 HTML 文件中搜索 <link> 标签或 <style> 标签内的 font-face 声明。在 CSS 文件中搜索 font-face 声明&#xff0c;特别是 src …

Jira的原理及应用详解(一)

本系列文章简介&#xff1a; 在当今快速发展的软件开发和项目管理领域&#xff0c;有效的团队协作和精确的项目进度追踪是确保项目成功的关键。Jira作为一款广受欢迎的项目和问题追踪工具&#xff0c;以其强大的功能、灵活的定制性以及卓越的用户体验&#xff0c;赢得了全球众多…

leetCode.90. 子集 II

leetCode.90. 子集 II 题目思路 代码 class Solution { public:vector<vector<int>> res;vector<int> path;vector<vector<int>> subsetsWithDup(vector<int>& nums) {// 先排序&#xff0c;让有相同元素的都放到一起sort(nums.begi…

深入理解 org.springframework.web.servlet.AsyncHandlerInterceptor

在Spring MVC框架中&#xff0c;AsyncHandlerInterceptor 是一个用于异步处理请求的关键接口&#xff0c;它扩展了标准的 HandlerInterceptor 接口&#xff0c;专为异步请求处理设计。通过实现这个接口&#xff0c;开发者可以介入到请求处理的不同阶段&#xff0c;执行自定义逻…

非计算机行业的人,如何使用大模型进行自媒体创作

对于非计算机行业的人来说&#xff0c;使用大模型进行自媒体创作可能需要一些技术支持或合作伙伴的帮助。但是学习门槛只要找到人就能够快速打破&#xff0c;因为你需要的不是掌握原理&#xff0c;而是熟练应用&#xff0c;为目前的应用场景提高效率甚至创造一个新的场景。以下…

定位一个PAM问题:passwd: Module is unknown

抛出问题 现场同事在安装PG数据库后&#xff0c;发现&#xff1a; su切root&#xff0c;报&#xff1a;passwd: Module is unknown passwd user1修改用户密码&#xff0c;报&#xff1a;passwd: Module is unknown 问题定位 看到这个报错&#xff0c;初步定位就是PAM的问题…

msconfig修改引导导致电脑无法进入系统 和 启动蓝屏问题

目录 解决方法遇到的问题开机蓝屏进入【指定UFEI固件设置】进入bios启动系统选择界面&#xff08;忘了拍照&#xff09; 解决方法 找到一个移动U盘&#xff08;最好大于10G&#xff09;格式化&#xff1b;找一个好的电脑安装WEPE软件&#xff08;wepe安装链接&#xff09;&…

php计模式之工厂模式详解

工厂模式是一种常见的设计模式&#xff0c;用于创建对象而无需直接暴露对象的创建逻辑。在 PHP 中&#xff0c;工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式。 1. 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 简单工厂模式是最简单的工厂模式…

链表算法题(OJ刷题超详细讲解)

1.返回倒数第K个节点&#xff0c; OJ链接&#xff1a;返回倒数第K个节点 本题有很多种解法&#xff0c;例如创建数组&#xff0c;或者将原链表反转等等&#xff0c;这里们使用快慢指针&#xff0c;只需要遍历一遍链表&#xff0c;并且空间复杂度为O(1)&#xff0c;时间复杂度为…

选择困难!?伦敦金etf谁胜一筹?

虽然伦敦金和黄金ETF都是黄金的投资方式&#xff0c;但它们有着许多不一样的地方。伦敦金市场是全球最大的黄金市场之一&#xff0c;每天的交易量巨大&#xff0c;没有任何财团或机构能够人为操控它&#xff0c;而且整个市场24小时公开地运行&#xff0c;投资者可以灵活把握市场…

HCIP-RS实验-OSPF单区域配置

目录 简介&#xff1a;建立新拓扑配置IP验证IP连通性配置单区域的OSPF查看网络连通性查看路由器运行的基本OSPF信息查看路由器的OSPF邻居关系建立情况查看路由器的OSPF数据库信息。 观察路由器在以太网上邻接关系的建立过程 简介&#xff1a; OSPF&#xff08;Open Shortest P…

在C#中使用 NLog 库进行日志记录

NLog 是 .NET 的日志记录框架。具有丰富的日志路由和管理能力&#xff0c;极大地帮助您生成和管理日志。NLog 是一个库&#xff0c;可以轻松地同时记录和管理多个不同区域&#xff08;例如控制台、数据库或文本文件&#xff09;中的数据。我们可以按如下方式列出 NLog 的功能&a…

云服务训练YOLOv8-训练改进

迪菲赫尔曼录制的视频 准备工作&#xff1a; 1、安装VSCode&#xff0c; 2、安装VSCode插件&#xff0c; Remote-SSH、Chinese(Simplified) 3、注册AutoDL账号 AutoDL算力云 4、上传数据集&#xff1a; 训练集 验证机 测试集 5、租服务器 6、连接服务器 7、下载代码…

天数智芯的天垓150 GUP性能及应用

天数智芯的天垓150是一款高性能的通用GPU训练产品&#xff0c;其性能特点及应用场景可以清晰归纳如下&#xff1a; 性能特点 高度兼容性&#xff1a; 天垓150采用通用GPU架构&#xff0c;兼容国际主流GPU通用计算模型&#xff0c;确保与各种主流系统和应用的顺畅集成。广泛支…