当前位置: 首页 > news >正文

设计模式十一:外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户端代码更加清晰、简洁。

外观模式的使用场景包括:

  1. 简化复杂子系统的调用:当一个系统中存在多个复杂的子系统时,可以使用外观模式将这些子系统封装起来,提供一个简单的接口给客户端使用。这样客户端就不需要直接与复杂子系统进行交互,从而简化了调用过程。
  2. 隔离变化:当系统中的子系统发生变化时,如果客户端与子系统直接耦合在一起,可能会导致大量的代码修改。而通过外观模式,只需要调整外观类即可,客户端无需做出任何修改,从而隔离了子系统变化对客户端的影响。
  3. 提供统一的接口:当系统中存在多个较为复杂的接口和协议时,可以使用外观模式将这些接口和协议封装成一个简单的接口,方便客户端进行调用。这样客户端无需关心具体的实现细节,只需要与外观接口进行交互即可。
  4. 构建分层结构系统:当系统需要采用分层结构时,可以使用外观模式建立各个层之间的联系。每个层的外观类作为对外的接口,隐藏了底层的实现细节,提供了一种简化的方式进行系统开发和维护。

外观模式中的主要角色有以下几个:

  1. 外观(Facade):外观角色是外部客户端访问复杂子系统的入口点。它封装了底层子系统的复杂性,提供了一个简单的接口供客户端使用。外观角色知道应该如何将客户端的请求委派给适当的子系统对象来进行处理。
  2. 子系统(Subsystem):子系统角色包含一组相关的类或接口,实现了子系统的具体功能。每个子系统都负责处理来自外观的请求,并根据需要执行相应的操作。外观将这些请求委派给合适的子系统对象来完成实际的工作。
  3. 客户端(Client):客户端角色通过调用外观角色提供的简化接口来间接地访问子系统的功能。客户端并不直接与子系统交互,而是通过外观角色来完成需要的操作。
    外观角色起到了协调和封装的作用,隐藏了子系统的复杂性,使得客户端可以更方便地使用子系统的功能。同时,子系统角色通过提供具体的实现来满足外观角色的请求。客户端角色则通过与外观角色进行交互间接地使用子系统的功能。

java代码举例

以外卖送货为例,根据业务分别将制作食物,运输方式,顾客信息拆分成三个服务,做一个外观模式,这三个服务集合在一起暴露一个对外接口
子系统:

/*** 制作Coffee*/
public class Coffee {public String getCoffee(String coffeeType) {return "1.The " + coffeeType + " is ready ;";}
}/*** 顾客信息*/
public class Customer {public String getCustomerInfo(String customerName) {return "3:Deliver to " + customerName + ";";}
}/*** 运输方式*/
public class Transport {public String getTransport(String transportType) {return "2.Choose " + transportType + ";";}
}

外观:

/*** 外观类* 集成制作Coffee,选择对应的运输方式,并送达到指定顾客手中*/
public class CoffeeFacade {private Coffee coffee;private Transport transport;private Customer customer;public CoffeeFacade() {this.coffee = new Coffee();this.transport = new Transport();this.customer = new Customer();}public String getCoffee(String coffeeType, String transportType, String customerName) {StringBuilder sb = new StringBuilder();sb.append(coffee.getCoffee(coffeeType));sb.append(transport.getTransport(transportType));sb.append(customer.getCustomerInfo(customerName));return sb.toString();}

客户端:

/*** 模拟客户端*/
public class Facade {public static void main(String[] args) {CoffeeFacade facade = new CoffeeFacade();String starbucks = facade.getCoffee("Starbucks", "take-out", "li-hong-wang");System.out.println(starbucks);}
}

运行结果

1.The Starbucks is ready ;
2.Choose take-out;
3:Deliver to li-hong-wang;

外观模式的优缺点

优点:

  1. 简化接口:外观模式通过封装复杂子系统的接口,提供了一个简化且统一的接口给客户端使用。这样可以降低客户端与子系统之间的耦合度,并且减少了客户端需要了解的知识。
  2. 隐藏实现细节:外观模式将复杂子系统的实现细节隐藏在后面,使得客户端不需要关心复杂的内部操作过程,只需通过外观对象进行简单的调用即可。
  3. 提高灵活性:通过外观模式,可以随时更改或扩展复杂子系统的实现,而不会影响到客户端代码。对于客户端来说,只要外观接口不发生变化,就不需要做任何修改。
  4. 降低依赖性:外观模式将客户端与子系统解耦,减少了客户端直接依赖于多个子系统的情况。这样可以减少代码的耦合度,并提高代码的可维护性和可测试性。

缺点:

  1. 过度增加外观类:如果系统中的子系统非常复杂,可能会导致外观类变得庞大而复杂。这样就会破坏了外观模式的简化和封装的初衷。
  2. 不符合开闭原则:当需要新增或修改子系统时,可能需要修改外观类的代码。这可能会导致外观类的频繁修改,违反了开闭原则。

相关文章:

设计模式十一:外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户…...

GIS和倾斜摄影的关系?

GIS(地理信息系统)和倾斜摄影是两种在地理空间数据处理和分析中扮演重要角色的技术。但是我们总是会分不清二者,本文就带大家从不同角度了解二者之间的关系。 概念 GIS是一种用来捕获、存储、分析和展示地理空间数据的技术,它可以…...

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织,只要有写代码的地方,就有代码版本管理的主场,初入职场,总会遇到第一个拦路虎 git 管理流程,但是每一个企业似乎都有自己的 git 管理流程,倘若我们能掌握…...

LeetCode105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 文章目录 [105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)一、题目二、题解 一、题目 给定两个整数数组 preorder 和 inorder ,其中 preo…...

编码技巧——Sentinel的blockHandler与fallback

本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法; 在查看源码前…...

最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用

由于GaN基Micro-LED表面积-体积比增加,其在热学方面的性质有别于大尺寸的LED,如缺陷复合导致的热效应将在发光区域中产生诸多“热”点,导致发光波长不均匀,这将影响后期显示系统的成像稳定性。针对上述问题,天津赛米卡…...

【Vue3】动态组件

动态组件的基本使用 动态组件(Dynamic Components)是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件,可以使用 元素,并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…...

Java超级玛丽小游戏制作过程讲解 第五天 创建并完成常量类04

//加载障碍物 try {obstacle.add(ImageIO.read(new File(path"brick.png")));obstacle.add(ImageIO.read(new File(path"soil_up.png")));obstacle.add(ImageIO.read(new File(path"soil_base.png"))); } catch (IOException e) {e.printStackTr…...

设置浏览器兼容

浏览器兼容 css兼容 cursor定义手型  Firefox不支持hand,IE支持pointer  解决方法:统一使用pointercss透明  IE:filter:progid:DXImageTransform.Microsoft.Alpha(style0,opacity60)  Firefox:opacity:0.6  解决…...

Java # List

ArrayList<>() import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName new ArrayList<>();  // 初始化 常用方法 方法描述add()将元素插入到指定位置的 arraylist 中addAll()添加集合中的所有元素到 arraylist 中clear()删除 arrayl…...

git原理与使用

目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档&#xff0c;当你设计好了&#xff0c;拿给他看时&#xff0c;他并不是很满意&#xff0c;就要你拿回去修改&#xff0c;你修改完后&#xff0c;再给他看时&#xff0c;他还是不满意&#xff0c;…...

【C语言题解】将一句话的单词进行倒置,标点不倒置。

题目描述&#xff1a;将一句话的单词进行倒置&#xff0c;标点不倒置。比如 “I like beijing.”&#xff0c;经过处理后变为&#xff1a;“beijing. like I”。 文章目录 原题目题目描述&#xff1a;输入描述&#xff1a;输出描述&#xff1a;题目链接&#xff1a; 整体思路分…...

Postman 的简单使用

什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求。可以对网页进行简单的基本信息调试。Postman最早是作用chrome浏览器插件存在的&#xff0c;但是2018年初Chrome停止对Chrome应用程序的支持。所以现在Postman提供了独立的安装包&#xff0c;不再依赖于Chrome浏览…...

在CentOS7安装部署GitLab服务

CentOS 7 安装 Gitlab 官方安装教程&#xff1a;https://about.gitlab.com/install/ 参考安装教程&#xff1a;https://developer.aliyun.com/article/74395 安装配置 Step1&#xff1a;配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo存入以下内容&#xff1a; [gitlab-c…...

订单系统就该这么设计,稳的一批~

订单功能作为电商系统的核心功能&#xff0c;由于它同时涉及到前台商城和后台管理系统&#xff0c;它的设计可谓是非常重要的。就算不是电商系统中&#xff0c;只要是涉及到需要交易的项目&#xff0c;订单功能都具有很好的参考价值&#xff0c;说它是通用业务功能也不为过。今…...

Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流

最近&#xff0c;Stability AI正式发布了下一代文生图模型——Stable Diffusion XL 1.0这次的1.0版本是Stability AI的旗舰版生图模型&#xff0c;也是最先进的开源生图模型。 在目前的开放式图像模型中&#xff0c;SDXL 1.0是参数数量最多的。官方表示&#xff0c;这次采用的…...

详细教程:如何搭建废品回收小程序

废品回收是一项环保举措&#xff0c;通过回收和再利用废弃物品&#xff0c;可以减少资源浪费和环境污染。近年来&#xff0c;随着智能手机的普及&#xff0c;小程序成为了推广和运营的重要工具。本文将详细介绍如何搭建一个废品回收小程序。 1. 进入乔拓云网后台 首先&#xf…...

什么是双亲委派机制?

什么是双亲委派机制&#xff1f; Parent Delegation Model &#xff0c;直译过来可能叫做父级委托模型更容易理解 类的加载过程 Java 编译器将 Java源文件编译成.class 文件再由 JVM 加载 .class 文件到内存中JVM 装载完成后得到一个 Class 字节码对象拿到字节码对象之后 &a…...

Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支

导读Mageia 9 首个 RC 已发布。公告写道&#xff0c;自 2023 年 5 月发布 beta 2 以来&#xff0c;Mageia 团队一直致力于解决许多顽固问题并提供安全修复和新特性。 新版本的控制中心添加了用于删除旧内核的新功能&#xff0c;该功能在 Mageia 9 中默认自动启用&#xff0c;用…...

ChatGPT: 人机交互的未来

ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发&#xff0c;并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式&#xff0c;提供高效、智能…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...