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

devtools/2024/11/30 7:36:35/

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/devtools/138128.html

相关文章

服务器命令行复制文件

服务器拷贝大文件太慢&#xff0c;而且容易断线&#xff0c;可以采用命令行复制文件 复制windows server服务器文件到linux服务器 scp D:\bim\uploadPath.zip ruoyixx.xx.xx.xx:/home/ruoyi/temp/uploadPath.zip 复制linux服务器文件到windows server服务器 scp ruoyixx.xx.…

物联网客户端在线服务中心(客服功能/私聊/群聊/下发指令等功能)

一、界面 私聊功能&#xff08;下发通知类&#xff0c;一对多&#xff09;群聊&#xff08;点对点&#xff09;发送指令&#xff08;配合使用客户端&#xff0c;基于cefsharp做的物联网浏览器客户端&#xff09;修改远程参数配置&#xff08;直接保存到本地&#xff09;&#…

【C++进阶篇】C++继承进阶:深入理解继承的复杂性

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

数据预处理方法—特征选择、特征缩放、特征构造

特征选择 1.1 原理 特征选择是选择对模型训练最重要的特征&#xff0c;减少数据维度&#xff0c;去除冗余或不相关特征&#xff0c;提高模型性能的性能和训练速度&#xff0c;减少过拟合。 1.2 核心公式 可以使用基于树模型的特征重要性度量&#xff0c;如在随机森林中计算特…

Git 的使用

Git 初始 个人本机使用&#xff1a;Git 基础命令和概念 多人共享使用&#xff1a;团队开发同一个项目的代码版本管理 Git 安装 检验安装是否成功&#xff1a; 打开 bash 终端&#xff08;git 专用&#xff09; 命令&#xff1a;git -v&#xff08;查看版本号&#xff09;…

ScratchLLMStepByStep——从零一步一步构建大语言模型

前言 在学习大语言模型的时候&#xff0c;总会遇到各种各样的名词&#xff0c;像自注意力、多头、因果、自回归、掩码、残差连接、归一化等等。这些名词会让学习者听的云里雾里&#xff0c;觉得门槛太高而放弃。 本教程将会带你从零开始&#xff0c;一步一步的去构建每一个组…

社群赋能电商:小程序 AI 智能名片与 S2B2C 商城系统的整合与突破

摘要&#xff1a;本文聚焦于社群在电商领域日益凸显的关键地位&#xff0c;深入探讨在社群粉丝经济迅猛发展背景下&#xff0c;小程序 AI 智能名片与 S2B2C 商城系统如何与社群深度融合&#xff0c;助力电商突破传统运营局限&#xff0c;挖掘新增长点。通过分析社群对电商的价值…

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…