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

目录

          • 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.示例截图
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习17

目录 一.System类: 1.System类常见方法 二.BigInteger和BigDecima类: 三.日期类: 1.Date:精确到毫秒,代表特定的瞬间。 2.Calendar: (1)简介: 3.第三代日期类: 1.第三代日期类的常用方…

freemarker ftl模板 格式、列表、图片

文章目录 前言一、freemarker实现内容替换二、ftl 模板1.word另存ftl2.编辑ftl文件2.1 了解一下常用的标记及其说明2.2 list处理2.3 红线2.4 图片 总结 前言 固定内容word生成:freemarker ftl模板 动态表格生成:https://blog.csdn.net/mr_wanter/articl…

假象和谎言

原创 | 刘教链 隔夜BTC(比特币)徘徊在69k一线。5.25教链内参报告,《BTC ETF持仓即将超越中本聪》。ETH ETF的尘嚣逐渐散去,复归于平静。戏刚唱了个开头,结尾还留着悬念。4000刀之于ETH看来是个关键阻力位,最…

智能视频监控技术为游泳馆安全护航,助力安全管理新升级

随着社会的进步和科技的发展,视频监控技术在各行各业的应用越来越广泛。游泳馆作为公共场所,每天都会有大量的游泳者进出。在这样的环境中,有时难免会发生一些意外事故,如溺水、摔倒等。因此,视频监控建设的必要性尤为…

云服务器如何使用局域网服务器的磁盘空间

说明 云服务器中的磁盘空间不足时,想要开通更多的磁盘空间,但奈何价格太贵,开不起 刚好局域网中有闲置的服务器空间可以拿来用,这里我们直接使用Samba服务来共享文件夹,使用frp来进行内网穿透; 1、磁盘挂…

选择海外代理IP需要注意什么?

跨境电商近年来的兴起与发展,越来越多的跨境从业者从事该行业,但在从事跨境贸易中则需要海外IP代理来突破地域限制、提升访问速度和稳定性、防止账号关联以及保护隐私和安全。这些功能都有助于跨境电商企业在全球范围内拓展业务,提升竞争力&a…

【JPCS出版,EI稳定检索会议推荐】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024)已成功申请JPCS出版,火热征稿中!

【EI核心、Scopus】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024)将于2024年7月5-7日在日本大阪举行。计算机、遥感与航空航天国际学术会议为来自世界各地的研究学者、工程师、学会会员以及相关领域的专家们提供一个关于“计算机科学”、“遥感技…

C++原创人工智能QPBS01G大功告成!!!

俗话说得好,你周五周六不写作业,要上学了才着急了 我之前的版本bug太多,结果这两天晚上改的我两眼发白,太烦人了 这次这娃学聪明了,遇到不会的问题上网搜,我还更新了反骂人骂人功能,第一次测试…

Nginx从入门到精通(一)Nginx 介绍

一、Nginx应用场景 1、HTTP服务器 Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。 2、FTP服务器 FTP服务器&#xff…

Go源码--sync库(1)

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

安卓 view淡入淡出(fade in fade out) kotlin

文章目录 前言一、布局文件二、kotlin扩展方法1.fadeOutAnimation 淡出动画2.fadeInAnimation 淡入动画 三、使用总结 前言 好久没写文章了,简单码一个淡入淡出,我们先上效果图 那么接下来上代码 一、布局文件 我这边直接将activity_main.xml改为下列代码,可以看到其中包含一…

SpringBoot和Apache Doris实现实时广告推荐系统

本专题旨在向读者深度解读Apache Doris技术,探讨其与SpringBoot框架结合在各类实际应用场景中的角色与作用。本专题包括十篇文章,每篇文章都概述了一个特定应用领域,如大数据分析、实时报告系统、电商数据分析等,并通过对需求的解析、解决方案的设计、实际应用示例的展示以…

Java | Leetcode Java题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution {public int maxDepth(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<TreeNode>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {int size queue.size();wh…

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来&#xff0c;网络安全已被国家上升为国家安全的战略层面&#xff0c;网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度&#xff0c;并实施了一些大型项目和计划&#xff0c;如网络安全法、等级保护、网络安全…

SOLIDWORKS教育版代理商应该如何选择?

SOLIDWORKS作为目前流行的三维设计软件在工程设计&#xff0c;制造和建筑中有着广泛的应用前景。教育版SOLIDWORKS软件是学生及教育机构学习教学的理想平台。 下面介绍几个挑选SOLIDWORKS教育版代理的关键要素: 1、专业知识与经验&#xff1a;代理商应掌握SOLIDWORKS等软件的丰…

富唯智能镀膜上下料设备采用最新的技术

现代工业竞争日趋激烈&#xff0c;高效生产已成为企业持续发展的关键。我们的设备不仅实现了高速上下料&#xff0c;更通过智能化控制系统实现了对生产流程的精准监控和调整&#xff0c;轻松应对高强度生产需求。 1、快速响应&#xff0c;高效生产 富唯智能镀膜上下料设备采用…

IP 分片过程及偏移量计算

IP 报头中与分片相关的三个字段 1、 标识符&#xff08; ldentifier )&#xff1a;16 bit 该字段与 Flags 和 Fragment Offest 字段联合使用&#xff0c; 对较大的上层数据包进行分段&#xff08; fragment &#xff09; 操作。 路由器将一个包拆分后&#xff0c;所有拆分开的…

el-date-picker限制时间选择,不能选择当前日期之后时间

要求&#xff1a;时间选择不能超过当前日期之后的 效果&#xff1a; 结构代码&#xff1a;&#xff1a; <el-form-item label"时间&#xff1a;"><el-date-pickerv-model"time"type"datetimerange"range-separator"至"start…

[LLM-Agent]万字长文深度解析规划框架:HuggingGPT

HuggingGPT是一个结合了ChatGPT和Hugging Face平台上的各种专家模型&#xff0c;以解决复杂的AI任务&#xff0c;可以认为他是一种结合任务规划和工具调用两种Agent工作流的框架。它的工作流程主要分为以下几个步骤&#xff1a; 任务规划&#xff1a;使用ChatGPT分析用户的请求…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合&#xff0c;随机丢弃神经元 -----------------…