【设计模式】【结构型模式(Structural Patterns)】之外观模式(Facade Pattern)

ops/2024/11/29 16:05:09/

1. 设计模式原理说明

外观模式(Facade Pattern) 是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。通过隐藏子系统的复杂性,外观模式简化了客户端对子系统的使用,提高了系统的易用性和降低了解耦程度。

主要角色
  1. Facade(外观):为子系统的类提供一个简化的接口。
  2. SubSystem Classes(子系统类):实现了子系统的功能,处理由 Facade 对象指派的工作。任何数目的子系统类都可以存在,它们不知道 Facade 的存在。

2. UML 类图及解释

UML 类图
+-----------------+                +-----------------+
|     Facade      |                | SubSystemClassA |
|-----------------|                |-----------------|
| - subsystemA: SubSystemClassA |  | + operationA(): void|
| - subsystemB: SubSystemClassB |  +-----------------+
| + operation(): void          |  
| + subOperationA(): void      |  +-----------------+
| + subOperationB(): void      |  | SubSystemClassB |
+-----------------+            |  |-----------------||  | + operationB(): void||  +-----------------+
类图解释
  • Facade:提供了一个简化的接口,用来访问子系统中的多个类。它内部包含了对各个子系统类的引用,并负责协调这些子系统类之间的交互。
  • SubSystemClassA 和 SubSystemClassB:代表了子系统的不同部分,它们各自完成特定的功能。这些类对外部是不可见的,只有通过 Facade 提供的接口才能访问它们。

3. 代码案例及逻辑详解

Java 代码案例
// 子系统类 A
class SubSystemClassA {public void operationA() {System.out.println("SubSystemClassA operationA");}
}// 子系统类 B
class SubSystemClassB {public void operationB() {System.out.println("SubSystemClassB operationB");}
}// 外观
class Facade {private SubSystemClassA subsystemA = new SubSystemClassA();private SubSystemClassB subsystemB = new SubSystemClassB();public void operation() {subsystemA.operationA();subsystemB.operationB();}
}// 客户端
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation();// 输出:// SubSystemClassA operationA// SubSystemClassB operationB}
}
C++ 代码案例
#include <iostream>// 子系统类 A
class SubSystemClassA {
public:void operationA() {std::cout << "SubSystemClassA operationA" << std::endl;}
};// 子系统类 B
class SubSystemClassB {
public:void operationB() {std::cout << "SubSystemClassB operationB" << std::endl;}
};// 外观
class Facade {
private:SubSystemClassA subsystemA;SubSystemClassB subsystemB;public:void operation() {subsystemA.operationA();subsystemB.operationB();}
};// 客户端
int main() {Facade facade;facade.operation();// 输出:// SubSystemClassA operationA// SubSystemClassB operationBreturn 0;
}
Python 代码案例
# 子系统类 A
class SubSystemClassA:def operationA(self):print("SubSystemClassA operationA")# 子系统类 B
class SubSystemClassB:def operationB(self):print("SubSystemClassB operationB")# 外观
class Facade:def __init__(self):self.subsystemA = SubSystemClassA()self.subsystemB = SubSystemClassB()def operation(self):self.subsystemA.operationA()self.subsystemB.operationB()# 客户端
if __name__ == "__main__":facade = Facade()facade.operation()# 输出:# SubSystemClassA operationA# SubSystemClassB operationB
Go 代码案例
package mainimport "fmt"// 子系统类 A
type SubSystemClassA struct{}func (a *SubSystemClassA) OperationA() {fmt.Println("SubSystemClassA operationA")
}// 子系统类 B
type SubSystemClassB struct{}func (b *SubSystemClassB) OperationB() {fmt.Println("SubSystemClassB operationB")
}// 外观
type Facade struct {subsystemA *SubSystemClassAsubsystemB *SubSystemClassB
}func NewFacade() *Facade {return &Facade{subsystemA: &SubSystemClassA{},subsystemB: &SubSystemClassB{},}
}func (f *Facade) Operation() {f.subsystemA.OperationA()f.subsystemB.OperationB()
}// 客户端
func main() {facade := NewFacade()facade.Operation()// 输出:// SubSystemClassA operationA// SubSystemClassB operationB
}

4. 总结

外观模式 是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。通过隐藏子系统的复杂性,外观模式简化了客户端对子系统的使用,提高了系统的易用性和降低了系统的耦合度。

主要优点
  1. 简化了客户端的使用:通过提供一个简单的接口,客户端无需关心子系统的内部细节,从而简化了客户端的代码。
  2. 解耦了客户端和子系统:客户端只需要依赖于外观,而不需要直接依赖于子系统中的各个类,从而降低了系统的耦合度。
  3. 提高了子系统的独立性:子系统可以独立地发展和变化,而不影响到外观和客户端。
主要缺点
  1. 不符合开闭原则:如果子系统发生变化,外观类也需要相应地进行修改。
  2. 可能会导致外观类过于臃肿:如果子系统的功能非常复杂,外观类可能会变得非常庞大,不易维护。
适用场景
  • 当需要为一个复杂的子系统提供一个简单接口时。
  • 当客户端需要与多个子系统交互,但只希望暴露有限的接口时。
  • 当需要减少系统之间或系统与其他系统之间的依赖关系时。

http://www.ppmy.cn/ops/137684.html

相关文章

【FPGA】UART串口通信

文章目录 一、通信方式1.串行通信2.并行通信 二、UART串口通信1.模块设计与时序图2.代码实现 三、测试结果1.仿真结果2.上板验证 一、通信方式 1.串行通信 串行通信是指利用一条传输线将数据一位位地顺序传送。&#xff08;也就是说串行通信传输的数据是1比特1比特的传送的&a…

【closerAI ComfyUI】物体转移术之AI模特换装,Flux三重控制万物一致性生图,赋能电商产品行业,小白两步完成!

更多AI前沿科技资讯,请关注我们: closerAIGC closerAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性!closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 产品经理逛世界 一只在互联网PM浪…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

C#开发合集

用C#轻松搞定m3u8视频下载与合并 嘿&#xff0c;程序员们&#xff01;今天咱们来聊聊如何用C#写个小程序&#xff0c;轻松下载和合并m3u8视频文件。没错&#xff0c;就是那种分段的流媒体视频。准备好了吗&#xff1f;让我们开始吧&#xff01; 准备工作 在动手之前&#xf…

Linux笔记--基于OCRmyPDF将扫描件PDF转换为可搜索的PDF

1--官方仓库 https://github.com/ocrmypdf/OCRmyPDF 2--基本步骤 # 安装ocrmypdf库 sudo apt install ocrmypdf# 安装简体中文库 sudo apt-get install tesseract-ocr-chi-sim# 转换 # -l 表示使用的语言 # --force-ocr 防止出现以下错误&#xff1a;ERROR - PriorOcrFoundE…

《C++ 与神经网络:自动微分在反向传播中的高效实现之道》

在深度学习蓬勃发展的今天&#xff0c;神经网络成为了众多领域的核心技术驱动力。而反向传播算法作为训练神经网络的关键手段&#xff0c;其背后的自动微分技术的高效实现尤为重要&#xff0c;特别是在 C 这样追求性能与内存控制极致的编程语言环境下。 神经网络通过大量的参数…

简单、跨平台、实时监控,Sampler让系统监控更轻松

在数字化时代&#xff0c;系统监控是确保IT基础设施稳定运行的关键。面对市场上众多复杂的监控系统&#xff0c;是否有一种工具能够简单、快速地部署&#xff0c;同时满足我们的监控需求&#xff1f;今天&#xff0c;我们就来介绍一个新兴的监控工具——Sampler。 为什么选择Sa…

spark 3.4.4 利用Spark ML中的交叉验证、管道流实现鸢尾花分类预测案例选取最优模型

前情回顾 前面的案例中&#xff0c;介绍了怎么基于管道流实现啊鸢尾花案例&#xff0c;利用逻辑斯蒂回归模型预测。详细内容步骤可以参照相应的博客内容 本案例内容 在 Spark 中使用交叉验证结合逻辑回归&#xff08;Logistic Regression&#xff09;以及管道流&#xff08;P…