设计模式: 结构型之外观模式(11)

外观模式概述

  • 外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的系统、程序库或框架提供一个简单(但有限)的接口
  • 这种模式的核心理念是隐藏系统的复杂性,仅对外暴露一个简化的接口,使得外部代码能够更容易地与系统进行交互

外观模式实现步骤


1 ) 定义外观类

  • 这个类将作为系统与外部世界之间的中介。它内部会包含对系统内部复杂子系统的引用,并对外提供一组简化后的方法

2 )封装子系统

  • 外观类会将原本需要直接调用多个子系统的方法封装成单一的方法,或者将原本复杂的流程简化为一个或多个简单的操作。

3 )对外暴露接口

  • 外观类提供的接口应该足够简单,使得外部代码能够轻松理解并使用,而不需要深入了解系统内部的复杂细节

外观模式示例

// 子系统中的各个类
interface SubSystemA {operationA(): string;
}interface SubSystemB {operationB(): string;
}class ConcreteSubSystemA implements SubSystemA {operationA(): string {return 'Subsystem A operation executed';}
}class ConcreteSubSystemB implements SubSystemB {operationB(): string {return 'Subsystem B operation executed';}
}// 外观类,提供统一接口
class Facade {private subsystemA: SubSystemA;private subsystemB: SubSystemB;constructor() {this.subsystemA = new ConcreteSubSystemA();this.subsystemB = new ConcreteSubSystemB();}public facadeMethod(): string {const resultA = this.subsystemA.operationA();const resultB = this.subsystemB.operationB();// 可能还会包含其他子系统操作和组合逻辑return `Facade combined results: ${resultA} and ${resultB}`;}
}// 客户端代码,使用外观类来调用子系统功能
function clientCode() {const facade = new Facade();const result = facade.facadeMethod();console.log(result); // 输出:Facade combined results: Subsystem A operation executed and Subsystem B operation executed
}clientCode();
  • 在上述例子中,我们首先定义了两个子系统接口 SubSystemASubSystemB,以及它们各自的实现类 ConcreteSubSystemAConcreteSubSystemB
  • 接着,我们创建了一个名为 Facade 的外观类,它包含了对子系统的引用,并对外提供了 facadeMethod() 这个统一的方法
  • Facade 类的 facadeMethod() 方法中,它调用了子系统的多个方法(如 operationA()operationB()),并将它们的结果进行了整合或处理
  • 最后,在客户端代码中,客户端只需要直接与 Facade 类交互,无需关心子系统的具体实现细节,从而简化了客户端的使用,降低了耦合度

外观模式优缺点


1 )外观模式的优点主要有以下几个方面

  • 简化接口
    • 外观模式通过提供一个简化的接口,将复杂的子系统功能整合在一起,使得使用者可以更容易地调用这些功能
    • 这降低了系统的复杂性,提高了代码的可读性和易用性
  • 解耦合
    • 外观模式将子系统与外部系统进行解耦合,使得子系统的变化不会影响到使用它的外部系统
    • 外部系统只需要通过外观接口来访问子系统,不需要了解子系统内部的实现细节,这提高了系统的灵活性和可扩展性
  • 提高可维护性
    • 由于外观模式将系统的复杂性隐藏在一个单独的外观类中,使得代码更加清晰和易于维护
    • 当需要修改或扩展子系统功能时,只需要修改外观类,而不需要修改大量的外部代码

2 )外观模式也存在一些缺点

  • 不符合开闭原则
    • 在某些情况下,当添加新的子系统或移除现有子系统时,可能需要修改外观类或者客户端的代码
    • 这违背了开闭原则,即软件实体应当对扩展开放,对修改封闭
  • 可能导致系统过于复杂
    • 如果过度使用外观模式,可能会增加系统中类的数量,从而增加系统的复杂度
    • 此外,如果外观类设计得过于复杂,可能会引入新的复杂性,使得代码难以理解和维护
  • 可能影响性能
    • 如果外观类的实现不够高效,可能会影响系统的性能
    • 特别是在处理大量数据或执行复杂计算时,外观类可能成为性能瓶颈

3 ) 综上所述

  • 外观模式在简化接口、解耦合和提高可维护性方面具有显著优势,但也可能带来一些缺点
  • 因此,在使用外观模式时需要根据具体需求进行权衡和选择

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

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

相关文章

libVLC 视频界面分割

先看看分割后的界面吧,根据分割的数量,来分割视频画面。 其实视频界面分割很简单,看过叠加窗口的这篇文章,不难理解,如何分割。 libVLC 视频窗口上叠加透明窗口-CSDN博客 如果还是不懂的话,我讲解一下原理…

【c++】-对象的初始化-构造函数和析构函数区别联系-总结

对象的初始化 1.构造函数和析构函数 构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数的功能是在创建对象时,使用给定的值来将对象初化。析构函数的功能是用来释放一个对象的,在对象删除前,用它来做一些清理工作&#xff0…

原码的除法运算

目录 王道考研ppt: 个人理解: 手算整数的除法: ​编辑 手算二进制的除法: 用机器实现除法: 方法一:恢复余数法 第二种方法:加减交替法 王道考研ppt: 个人理解: 手…

政安晨:【深度学习神经网络基础】(三)—— 激活函数

目录 线性激活函数 阶跃激活函数 S型激活函数 双曲正切激活函数 修正线性单元 Softmax激活函数 偏置扮演什么角色? 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨…

【完全背包求方案数问题】AcWing1023.买书(赋练习题目)

【题目链接】活动 - AcWing 输入样例1&#xff1a; 20输出样例1&#xff1a; 2输入样例2&#xff1a; 15输出样例2&#xff1a; 0输入样例3&#xff1a; 0输出样例3&#xff1a; 1 【代码】 //1023.买书——完全背包问题#include<bits/stdc.h>using namespace st…

IP定位的原理及应用场景

IP定位&#xff0c;即通过IP地址来确定一个设备或用户所在的大致地理位置&#xff0c;是一项在现代网络时代中愈发重要的技术。它广泛应用于网络安全、数据分析、广告投放等多个领域&#xff0c;为人们的生活和工作带来了极大的便利。本文将从IP定位的原理、实现方式、应用场景…

基于springboot的大型商场应急预案管理系统源码数据库

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个计算机管理大型商场应急预案管理系统的方案。文章…

百度Create AI开发者大会剧透丨用好三大AI神器 ,人人都是开发者

程序员会消失&#xff0c;真的吗&#xff1f;大模型的下一站是什么&#xff1f;开发者的机会在哪里&#xff1f;什么才是最好用的AI应用开发工具&#xff1f;在4月16日举办的2024百度Create AI开发者大会上&#xff0c;百度创始人、董事长兼首席执行官李彦宏将就这些备受瞩目的…

算法刷题day45

目录 引言一、母亲的牛奶二、奶牛回家三、扫雷 引言 今天主要复习了图论里的最短路、 B F S 、 D F S 、 F l o o d F i l l BFS、DFS、Flood\ Fill BFS、DFS、Flood Fill 算法&#xff0c;其实到现在感觉暴搜其实还挺好写的&#xff0c;现在刚好反过来了&#xff0c;不喜欢写…

Vue的学习之旅-part4

Vue的学习之旅-part1 vue的自带指令v-if v-else-if v-else虚拟DOM的复用v-show 与 v-if 的不同之处&#xff1a;v-if v-show各自合适的使用位置&#xff1a; v-for 循环v-for 循环遍历 :key"item" 绑定key&#xff0c;区分循环的内容循环的应用&#xff1a; 前几篇博…

257.二叉树的所有路径

给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 class Solution{public List<String> binaryTreePaths(TreeNode root){List<String> paths new ArrayList<>():c…

单片机蓝牙数据传输刚开始正常然后乱码什么原因

单片机蓝牙数据传输在开始时正常&#xff0c;但随后出现乱码的情况可能由多种原因引起。以下是一些可能的原因及解决方法&#xff1a; 波特率不匹配&#xff1a;单片机与蓝牙模块之间的波特率设置不一致可能导致数据传输错误。确保两者使用的波特率相同&#xff0c;并检查是否…

宏观认知第一篇--AI 是否就是第四次工业革命?

今年春节期间李一舟老师突然爆火&#xff0c;成功晋升为能与 ChatGPT 公司 CEO 齐名的中国 AI 大佬&#xff0c;赚到几个小目标后又火速被封&#xff0c;于是想着有空写篇小文章讲一讲跟普通人切身相关的话题-- AI 是否就是第四次工业革命&#xff1f; “AI 是否就是第四次工业…

【Java核心技术】第4章 对象与类

1 面向对象 2 自定义类 形式&#xff1a; class ClassName { field // 字段 constructor // 构造器&#xff08;构造函数&#xff09; method // 方法 } 如&#xff1a; class Employee {private String name;private double salary;private LocalDate hireDay;public Emp…

“桃花庵主”是我国哪位古代名人的称号?2024年4月12日蚂蚁庄园今日答案

原文来源&#xff1a;蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&…

.a和.so库文件是什么?

我们在编译开源代码后&#xff0c;通常会生成.a和.so这两个库文件&#xff0c;这两个文件有什么区别&#xff1f;又如何使用&#xff1f; 在 Linux 中&#xff0c;.a 和 .so 文件都是库文件&#xff0c;但它们有一些区别&#xff1a; 静态库文件&#xff08;.a&#xff09;&am…

全量知识系统 程序详细设计之 原型库(QA百度搜索)

Q1. 今天聊聊全知系统中的原型库设计 全知系统中的原型库设计是一个关键环节&#xff0c;它涉及到系统的整体架构、功能需求、用户体验等多个方面。以下是一些关于全知系统中原型库设计的讨论&#xff1a; 明确设计目标&#xff1a;在设计原型库之前&#xff0c;需要明确设计…

fixed固定定位transofrm失效的解决

<div class"container"><div class"fixed"></div><div class"content"><div class"centered">Centered Content</div></div></div> 固定定位&#xff08;position: fixed&#xff0…

docker安装Neo4j

1、创建文件夹用作目录映射 mkdir -p /mydata/neo4j/{conf,data,import,logs,plugins} chmod -R 777 /mydata/neo4j/{conf,data,import,logs,plugins}2、拉去镜像 docker pull neo4j3、启动容器 docker run \ -d --name neo4j \ -p 7474:7474 -p 7687:7687 \ -v /mydata/neo…

pygame第7课——实现简单一个打砖块游戏

目录 专栏导读之前的课程1、小球类设计2、挡板类的设计3、砖块类4、砖块与小球的边界碰撞检测5、检测到碰撞&#xff0c;删除砖块&#xff0c;改变运动方向完整版代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 …