(二)结构型模式:6、外观模式(Facade Pattern)(C++实例)

news/2025/1/18 11:56:28/

目录

1、外观模式(Facade Pattern)含义

2、外观模式的UML图学习

3、外观模式的应用场景

4、外观模式的优缺点

5、C++实现外观模式的简单实例


1、外观模式(Facade Pattern)含义

外观模式(Facade Pattern),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

(1)外观模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端更容易使用子系统。

(2)外观模式的核心思想是通过创建一个外观类(也称为门面类),将客户端与子系统解耦,客户端只需要通过外观类来与子系统进行交互,而不需要直接调用子系统的接口。

2、外观模式的UML图学习

在外观模式中,有以下几个关键角色:

 (1)外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,用于访问子系统中的一组接口。外观类封装了对子系统的调用,隐藏了子系统的复杂性,为客户端提供了一个简单的接口。

(2)子系统(Subsystem):子系统是实现具体功能的一组类或模块。每个子系统都有自己的一组接口和实现逻辑。子系统可以是一个或多个类的集合。

(3)客户端(Client):客户端通过外观类来与子系统进行交互。客户端不需要直接调用子系统的接口,而是通过外观类提供的简单接口来完成操作。

在外观模式中,外观类充当了客户端与子系统之间的中介,它将客户端的请求转发给子系统,并将子系统的结果返回给客户端。这样,客户端只需要与外观类进行交互,而无需了解子系统的具体实现细节。

外观模式的目的是简化客户端与子系统之间的交互,降低耦合度,提高系统的可维护性和可扩展性。

3、外观模式的应用场景

(1)当需要简化复杂子系统的接口并提供一个统一的接口时。

(2)当需要将客户端与子系统解耦,以降低客户端与子系统之间的依赖性时。

(3)当需要对子系统进行封装,隐藏其复杂性,提高系统的易用性和可维护性时。

4、外观模式的优缺点

(1)优点:

1)简化接口:外观模式提供了一个简单的接口,隐藏了子系统的复杂性。客户端只需要与外观类进行交互,无需了解子系统的具体实现细节,从而简化了客户端的调用过程。

2)解耦子系统和客户端:外观模式将客户端与子系统之间的依赖关系解耦,使得它们可以独立演化。当子系统发生变化时,只需要调整外观类即可,而不会影响到客户端。

3)提高可维护性:外观模式将复杂的子系统封装在一个外观类中,使得系统结构更加清晰,易于理解和维护。对于客户端来说,只需要关注外观类的接口,而不需要关心子系统的具体实现。

4)提高代码复用性:外观模式可以将一些常用的操作封装在外观类中,供多个客户端共享使用,从而提高了代码的复用性。

(2)缺点:

1)不符合开闭原则:当需要新增或修改子系统的功能时,可能需要修改外观类的代码。这违反了开闭原则,可能会导致外观类的修改引起其他客户端的不稳定。

2)可能引入性能问题:外观模式可能会引入一层间接调用,导致系统性能下降。因此,在设计时需要权衡系统的性能和代码结构的清晰度。

3)可能增加系统复杂性:如果一个系统本身就很简单,使用外观模式可能会增加不必要的复杂性,使得代码变得冗余。

总体来说,外观模式是一种有用的设计模式,可以提供简化的接口,解耦子系统和客户端,并提高系统的可维护性和可扩展性。但在使用时需要注意遵循设计原则,权衡好代码的灵活性、性能和复杂性。

5、C++实现外观模式的简单实例


#include <iostream>// 子系统A
class SubsystemA
{
public:void operationA() {std::cout << "Subsystem A operation" << std::endl;}
};// 子系统B
class SubsystemB 
{
public:void operationB() {std::cout << "Subsystem B operation" << std::endl;}
};// 外观类
class Facade 
{
private:SubsystemA subsystemA;SubsystemB subsystemB;public:void operation() {subsystemA.operationA();subsystemB.operationB();}
};int main() 
{// 创建外观对象Facade facade;// 调用外观对象的操作方法facade.operation();return 0;
}

在上述示例中,我们定义了两个子系统类 SubsystemA 和 SubsystemB,分别具有自己的操作方法 operationA 和 operationB。

然后,我们创建了一个外观类 Facade,该类持有 SubsystemA 和 SubsystemB 的实例,并提供了一个操作方法 operation,该方法内部调用了子系统的操作方法。

在 main 函数中,我们创建了一个外观对象 facade,并通过调用 facade.operation() 来间接访问子系统的功能。

运行以上代码,输出将会是:

Subsystem A operation

Subsystem B operation

可以看到,通过外观模式,我们可以通过简单的接口来访问复杂的子系统功能,而无需直接与子系统进行交互。


http://www.ppmy.cn/news/1037937.html

相关文章

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…

Python程序设计——元组、集合和字典

可以使用元组存储一个固定的元素列表&#xff0c;使用集合存储和快速访问不重复的元素、使用字典存储键值对并使用这些关键字来快速访问元素。 一、元组 元组跟列表类似&#xff0c;但是元组中的元素是固定的;也就是说&#xff0c;一旦一个元组被创建,就无法对元组中的元素进行…

力扣75——图深度优先搜索

总结leetcode75中的图深度优先搜索算法题解题思路。 上一篇&#xff1a;力扣75——二叉搜索树 力扣75——图深度优先搜索 1 钥匙和房间2 省份数量3 重新规划路线4 除法求值1-4 解题总结 1 钥匙和房间 题目&#xff1a; 有 n 个房间&#xff0c;房间按从 0 到 n - 1 编号。最初…

lvs集群与nat模式

一&#xff0c;什么是集群&#xff1a; 集群&#xff0c;群集&#xff0c;Cluster&#xff0c;由多台主机构成&#xff0c;但是对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与ip地址&#xff09;&#xff0c;相当于一台大型计算机。 二&#xff0c;集…

途乐证券-宁德时代发力超充赛道,高压快充概念强势拉升,泰永长征涨停

高压快充概念17日盘中强势拉升&#xff0c;到发稿&#xff0c;泰永长征涨停&#xff0c;万祥科技涨超9%&#xff0c;英可瑞涨逾8%&#xff0c;迦南智能涨超4%。 消息面上&#xff0c;8月16日&#xff0c;宁德时代举行线下新品发布会&#xff0c;正式发布全球首款磷酸铁锂4C超充…

windows退出虚拟环境时候出现:deactivate does not accept arguments

最近更新了conda版本&#xff0c;之前都是用conda deactivate xx&#xff0c;来退出xx虚拟环境&#xff0c;现在再用这个命令出现了问题“deactivate does not accept arguments”&#xff0c;解决方法也比较简单&#xff1a;只需要输入以下代码块即可&#xff1a; conda deac…

在Gazebo中添加悬浮模型后,利用键盘控制其移动方法

前段时间写了文章&#xff0c;通过修改sdf、urdf模型的方法&#xff0c;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;修改sdf、urdf模型_sagima_sdu的博客-CSDN博客 今天讲…

删除数组最后一个元素、第一个元素、某个指定下标的元素、某个指定元素的方法、 获取两个数组之前的交集和并集

1、删除数组最后一个元素的方法有哪些&#xff1f; ① pop&#xff1a;默认删除数组最后一个元素【会改变原数组&#xff0c;返回被删除的元素】 function deleteLastItem(arr) {arr.pop() // pop删除return arr } let arr [1, {name:arr}, 3] console.log(deleteLastItem(a…