【软考】设计模式之外观模式

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 8. java示例

1. 说明
  • 1.为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  • 2.Facade Pattern。
  • 3.是一种结构型设计模式,提供了一种简化的接口,用于访问
  • 4.这种模式的主要目标是简化客户端与子系统之间的交互,同时降低系统的耦合度
  • 5.在外观模式中,通常会有一个外观类(Facade),它充当客户端和子系统之间的中介。
  • 6.外观类知道哪些子系统负责处理请求,并将客户端的请求代理给适当的子系统对象。
  • 7.通过这种方式,客户端只需要与外观类进行交互,而不需要了解系统内部的具体细节和复杂性。
2. 应用场景
  • 1.当系统的复杂度较高时,可以使用外观模式来简化系统的使用。通过提供一个简单的接口,可以将系统的复杂性内部化,对外提供一个简单的接口,使得使用者更加容易使用。
  • 2.当系统中存在多个包含关系复杂的接口时,可以使用外观模式进行封装。将多个复杂的接口封装成一个简单的接口,可以减少客户端所需处理的对象数目,并使得子系统使用起来更加容易。
  • 3.当系统需要对外封闭时,可以使用外观模式来进行封装。外界只能通过一个统一的接口来访问系统,这样可以有效提高系统的安全性。
  • 4.当系统需要进行重构时,可以使用外观模式来进行重构。将系统功能进行重组,减少耦合,从而提高系统的灵活性和可扩展性。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.Facade(外观类):知道哪些子系统负责处理请求;将客户的请求代理给适当的子系统对象。这是模式的核心部分,为子系统的一组接口提供一个统一的高层接口,使得子系统更容易使用。客户端只需要与外观类进行交互,而不需要了解子系统内部的具体细节和复杂性。
  • 2.Subsystem classes(子系统):实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息,即没有指向Facade的指针。
  • 3.客户端(Client):客户端与外观类进行交互,通过外观类提供的高层接口访问子系统。客户端不需要了解子系统内部的具体实现细节,只需要知道外观类提供的接口和方法即可。
5. 适用性
  • 1.要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。
  • 2.Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
  • 3.客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 4.当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。
6. 优点
  • 1.简化客户端操作:外观模式为客户端提供了一个简化的、统一的接口,使得客户端无需关心子系统内部的复杂性和实现细节,从而降低了客户端与子系统之间的耦合度。
  • 2.降低系统复杂性:当系统非常复杂时,外观模式可以隐藏子系统内部的复杂性,使得客户端只需要关注与外观类的交互,而无需了解子系统内部的实现细节。
  • 3.提高系统的可维护性:由于外观类将客户端与子系统的交互进行了封装,当子系统内部发生变化时,只需要修改外观类即可,而无需修改所有客户端代码,从而提高了系统的可维护性。
  • 4.灵活的扩展性:当需要添加新的子系统或修改现有子系统时,只需要在外观类中添加或修改相应的代码,而无需修改客户端代码,从而保持了客户端的稳定性。
  • 5.符合“最少知识原则”:外观模式使得客户端只需要与外观类进行交互,而无需了解子系统内部的具体实现细节,这符合了“最少知识原则”,即一个软件实体应当尽可能少地与其他实体发生相互作用。
7. 缺点
  • 1.不符合“开闭原则”:在某些情况下,当需要为子系统添加新的功能时,可能需要修改外观类的代码,从而违反了“开闭原则”(即对扩展开放,对修改封闭)。
  • 2.可能增加系统复杂性:如果外观类设计得过于复杂,可能会增加系统的整体复杂性,使得系统难以理解和维护。
  • 3.不适用于所有场景:外观模式主要适用于子系统相对独立、接口稳定且客户端不需要直接访问子系统内部细节的场景。如果子系统之间存在紧密的联系或者客户端需要直接访问子系统内部细节,那么使用外观模式可能并不合适。
  • 4.可能隐藏了子系统的错误:由于外观类将客户端与子系统的交互进行了封装,当子系统内部出现错误时,这些错误可能会被外观类隐藏起来,使得客户端难以发现和定位问题。
  • 5.可能增加性能开销:在某些情况下,由于外观类需要处理多个子系统的交互,可能会导致性能下降。特别是在处理大量数据或进行复杂计算时,这种性能开销可能会更加明显。
8. java示例
  • 1.子系统接口
package com.learning.facade;// 点餐子系统接口
public interface MealSubsystem {void order();  void prepare();  void serve();  
}
  • 2.主餐子系统接口
package com.learning.facade;// 主菜子系统
public class MainFood implements MealSubsystem {@Override  public void order() {  System.out.println("点主餐");}  @Override  public void prepare() {  System.out.println("准备主餐");}  @Override  public void serve() {  System.out.println("端上主餐");}  
}  
  • 3.甜品子系统接口
package com.learning.facade;// 甜品子系统
public class Dessert implements MealSubsystem {@Override  public void order() {  System.out.println("点甜品");}  @Override  public void prepare() {  System.out.println("准备甜品");}  @Override  public void serve() {  System.out.println("端上甜品");}  
}  
  • 4.汤子系统接口
package com.learning.facade;// 汤品子系统
public class Soup implements MealSubsystem {@Override  public void order() {  System.out.println("点汤");}  @Override  public void prepare() {  System.out.println("准备汤");}  @Override  public void serve() {  System.out.println("端上汤");}  
}
  • 4.外观类服务员
package com.learning.facade;/*** 外观类 - 服务员*/
public class Waiter {private MealSubsystem mainFood;private MealSubsystem soup;  private MealSubsystem dessert;  public Waiter() {  this.mainFood = new MainFood();this.soup = new Soup();  this.dessert = new Dessert();  }  public void orderMeal() {  mainFood.order();soup.order();  dessert.order();  // 假设准备和送餐是同时进行的  prepareAndServe();  }  private void prepareAndServe() {  mainFood.prepare();soup.prepare();  dessert.prepare();  mainFood.serve();soup.serve();  dessert.serve();  }  
}  
  • 4.客户端
package com.learning.facade;// 客户端
public class Client {  public static void main(String[] args) {  Waiter waiter = new Waiter();// 顾客告诉服务员点餐,服务员负责处理整个点餐、准备和送餐流程waiter.orderMeal();}  
}
  • 5.示例截图
    在这里插入图片描述

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

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

相关文章

Node.js —— Express中服务器的创建、托管静态资源、nodemon

目录 Express的安装 创建基本的 Web 服务器 监听GET请求 监听POST请求 把内容响应给客户端 ​编辑获取 URL 中携带的查询参数 ​编辑获取 URL 中的动态参数 ​编辑托管静态资源 express.static() 托管多个静态资源目录 挂载路径前缀 nodemon: 为什么要使用 nodemon 安…

ubuntu22.04安装调节显示器亮度工具

1 介绍 软件名叫 DDC/CI control,官网 2 安装方法 sudo apt install intltool i2c-tools libxml2-dev libpci-dev libgtk2.0-dev liblzma-dev3 效果 进入软件,忽略告警信息

【算法】dd爱转转

✨题目链接: dd爱旋转 ✨题目描述 读入一个n∗n的矩阵,对于一个矩阵有以下两种操作 1:顺时针旋180 2:关于行镜像 如 变成 给出q个操作,输出操作完的矩阵 ✨输入描述: 第一行一个数n(1≤n≤1000),表示矩阵大小 接下来n行&#xff…

2022icpc亚洲区域赛(南京站)Problem D - 聊天程序

2022 i c p c 亚洲区域赛(南京站) P r o b l e m D − 聊天程序 \Huge{2022icpc亚洲区域赛(南京站)Problem D - 聊天程序} 2022icpc亚洲区域赛(南京站)ProblemD−聊天程序 文章目录 题意思路标程 题目链接&…

为什么使用数据库类型器件库

项目地址:https://github.com/boringhex-top/OpenECADLib Altium 数据库类型器件库(DbLib)具有显著的优势,特别是对于复杂设计和高效元件管理来说。这里详细介绍数据库类型器件库的优势以及相关背景知识,以帮助你更好…

Transformer详解(6)-解码器

Transformer解码器 import copy from torch import nn from norm import Norm from multi_head_attention import MultiHeadAttention from feed_forward import FeedForward from pos_encoder import PositionalEncoderdef get_clones(module, N):"""Create N…

汇编:循环结构

16位汇编语言中的循环结构主要通过条件跳转指令(如LOOP、JMP, JE, JNE, JG, JL, 等)来实现,常见的循环类型包括for循环和while循环; Loop指令 LOOP指令的操作非常简单:它将CX寄存器的值减1,如果结果不为零…

【C++】list的使用方法和模拟实现

❤️欢迎来到我的博客❤️ 前言 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后…

AI日报:百度发布文心大模型学习机;Open-Sora 1.1可生成21秒视频;Canva可以自动剪辑视频了;超牛ComfyUI节点AnyNode来了

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南,每天我们为你呈现AI领域的热点内容,聚焦开发者,助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 1、百度文心…

网络、HTTP、HTTPS、Session、Cookie、UDP、TCP

OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP 五层模型 应用层:为用户的应用进程提供网络通信服务(协议:域名系统DNS协议,HTTP协议,SMTP协议)传输层:负…

leetcode 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

leetcode 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先 leetcode 530.二叉搜索树的最小绝对差 题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/ 题目: 给你一个二叉搜索树的根节点 r…

【MATLAB源码-第214期】基于matlab的遗传算法GA最短路径路由优化算法仿真。

操作环境: MATLAB 2022a 1、算法描述 在现代网络通信和路径规划领域,最短路径路由优化算法是一项关键技术。它涉及在给定的网络拓扑中寻找从源点到目标点的最短或成本最低的路径。近年来,遗传算法(GA)因其出色的全局…

跟进2年弄丢1.8亿,你的大客管理错在哪里?

数量并非目的之所在,质量才是根本之道。重视1%的超级用户,才是提高效率的关键所在。 ——凯文凯利 在当今的商业环境中,大客户已成为销售服务型企业最宝贵的资产。他们不仅贡献了企业收入的重要一环,…

Vue 项目中使用 Element UI库(Element UI 是一套基于 Vue.js 的桌面端组件库)

1. 安装 Element UI npm install element-plusnext 2.引入 Element UI(在main.js中引入组件,注意要引入.css文件,图标也要单独引用) import { createApp } from vueimport ElementPlus from element-plusimport element-plus/dist/index.css…

pinia持久化未生效

pinia官方文档 https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/ pinia持久化未生效的原因很有可能就是在main.js中重复创建了pinia,导致持久化未生效

sql注入利用group_concat函数

1.group_concat函数的作用: 首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。 2.group_concat运用 这里我使用的是sqllab-less1,通过对数据库的查询,我们发现数据库表名,列名&a…

qmt量化交易策略小白学习笔记第1期【qmt如何获取股票概况?】

#获取股票概况 包含股票的上市时间、退市时间、代码、名称、是否是ST等。 #获取合约基础信息数据 该信息每交易日9点更新 调用方法 大蟒 from xtquant import xtdata xtdata.get_instrument_detail(stock_code) 参数 名称 类型 描述 stock_code string 合约代码 返…

手写电纸书天花板,阅读办公新体验 | 汉王手写电纸本 N10 2024 版使用评测

手写电纸书天花板,阅读办公新体验 | 汉王手写电纸本 N10 2024 版使用评测 请问如果说到电纸书,你的认知还只是Kindle吗?然而遗憾的是,Kindle亦是过去,智能才是未来。 哈喽小伙伴们好,我是Stark-C~&#x…

Mysql基础学习:mysql8 JSON字段查询操作

文章目录 一、查询JSON中某个属性值为XXX的数据量1、方式一2、方式二 二、查询的JSON中的value并去除双引号 一、查询JSON中某个属性值为XXX的数据量 1、方式一 select count(*)from table_namewhere JSON_CONTAINS(json-> $.filed1, "xxx")or JSON_CONTAINS(jso…

蓝桥杯嵌入式国赛笔记(4):多路AD采集

1、前言 蓝桥杯的国赛会遇到多路AD采集的情况,这时候之前的单路采集的方式就不可用了,下面介绍两种多路采集的方式。 以第13届国赛为例 2、方法一(配置通道) 2.1 使用CubeMx配置 设置IN13与IN17为Single-ended 在Parameter S…