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

news/2025/2/13 22:45:42/

文章目录

  • 前言
  • 一、什么是外观模式?
    • 1.定义和原理
    • 2.应用场景
  • 二、外观模式的优缺点
    • 1.优点
    • 2.缺点
  • 三、实际应用案例
    • 1.代码实现
    • 2.讨论
  • 五、总结

前言

外观模式通过提供一个统一的高级接口,使得访问复杂子系统变得更简单。这种模式的核心在于,它为复杂的系统流程和操作提供了一个简化的外部界面,从而隐藏系统的复杂性,使得客户端代码可以更加容易地与系统交互。在实际应用中,外观模式不仅能提升软件的可用性,还能在很大程度上增强软件的可维护性和可扩展性。

一、什么是外观模式?

1.定义和原理

外观模式(Facade Pattern)是一种广泛应用于软件工程的设计模式,其核心思想在于提供一个统一的接口来访问某一复杂子系统或框架的多个内部接口。这种模式通过创建一个外观类(Facade Class),隐藏了子系统的复杂性,使得客户端在使用时只需与外观类交互,而不必关心子系统的内部细节。

在外观模式中,外观类充当客户端和子系统之间的中介者。客户端通过外观类调用所需的功能,而外观类则负责将这些请求委派给相应的子系统内部对象。这样,即使子系统内部发生变化,客户端代码也不需要做出相应的修改,从而保持了客户端与子系统之间的松耦合关系。

2.应用场景

  • 初期系统构建:在系统初期设计时,外观模式可以用来为复杂的模块或子系统提供一个简单的接口。这样做不仅使得子系统更易于使用,而且也有助于分离关注点,使系统结构更清晰。

  • 系统维护和扩展:对于已有的大型复杂系统,引入外观模式可以帮助减少系统间的直接依赖。通过将系统间的交互封装在外观类中,可以更容易地进行系统的升级和维护,同时也提高了代码的可重用性。

  • 屏蔽复杂性:当子系统特别复杂,或者由多个复杂的子系统组成时,使用外观模式可以隐藏其内部的复杂性,为客户端提供一个简单清晰的接口。这对于减轻客户端的负担,简化客户端与子系统的交互是非常有益的。

  • 隔离变化:如果预计子系统未来可能会发生变化,使用外观模式可以有效地隔离这些变化,防止它们影响到客户端。通过外观类对子系统进行封装,即使子系统内部发生了改变,外观类的接口仍然保持不变,从而保护了客户端不受影响。

二、外观模式的优缺点

1.优点

  • 简化客户端操作:外观模式为复杂的子系统提供一个简单的接口,使得客户端在使用时不需要了解子系统的复杂性,从而简化了客户端的操作。

  • 降低系统复杂性:通过封装复杂的子系统,外观模式能够有效降低整个系统的复杂度。它允许用户通过一个简单的接口与系统交互,而无需关心系统内部的复杂逻辑。

  • 提升子系统独立性和安全性:外观模式有助于隔离子系统和客户端之间的直接交互,减少了它们之间的依赖。这不仅增强了子系统的独立性,还提高了整个系统的安全性,因为子系统的内部实现被隐藏起来,不容易受到外部干扰。

  • 易于维护和扩展:当子系统需要更改或升级时,由于客户端只与外观类交互,因此更改子系统的内部实现不会影响到客户端。这使得系统更易于维护和扩展。

2.缺点

  • 限制系统的灵活性:由于外观模式提供了一个有限的接口,这可能限制了客户端使用子系统功能的灵活性。客户端只能通过外观类提供的接口与子系统交互,这可能会限制一些特定需求的实现。

  • 可能导致子系统功能不足:如果外观类没有正确或充分地暴露子系统的功能,可能会导致子系统的一些重要功能被遗漏或者使用不便,从而限制了子系统的功能性。

  • 难以控制性能问题:当外观类成为子系统与客户端通信的唯一通道时,所有的通信都需要通过外观类进行。这可能会导致性能瓶颈,尤其是在高负载情况下。

  • 不适用于所有子系统:对于一些特别复杂或深度依赖的子系统,使用外观模式可能不太合适,因为它可能无法有效地封装这些子系统的全部复杂性。

三、实际应用案例

1.代码实现

我们定义了两个子系统 SubsystemOneSubsystemTwo,以及一个外观类 Facade。外观类提供了一个统一的方法 method,客户端可以通过这个方法来同时调用这两个子系统的方法,而不需要直接与它们交互。

class SubsystemOne {public void methodOne() {// ... 子系统一的具体实现 ...}
}class SubsystemTwo {public void methodTwo() {// ... 子系统二的具体实现 ...}
}class Facade {private SubsystemOne one;private SubsystemTwo two;public Facade() {one = new SubsystemOne();two = new SubsystemTwo();}public void method() {one.methodOne(); // 调用子系统一的方法two.methodTwo(); // 调用子系统二的方法}
}

2.讨论

外观模式的主要作用体现在:

  • 简化客户端操作:客户端不再需要单独与每个子系统进行交互,而是通过外观类的一个方法即可完成所有所需的操作,极大地简化了客户端的工作。

  • 提高代码的可读性和可维护性:通过将复杂的子系统调用封装在外观类中,代码的可读性和可维护性得到了提升。任何对子系统的修改都不会直接影响到客户端,这对于保持代码的清洁和可管理性非常重要。

  • 降低了系统间的耦合度:外观模式降低了客户端与子系统之间的直接依赖,提高了系统的灵活性和健壮性。

五、总结

外观模式的核心在于提供一个统一的接口,通过这个接口将复杂系统的多个部分或子系统封装起来,使得这些子系统对客户端更易于使用和理解。这种模式特别适用于那些具有多个复杂子系统的大型软件项目,可以显著降低这些系统的复杂性和客户端与其交互的难度。


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

相关文章

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

github 笔记: fatal: Could not read from remote repository.

git clone 包时出现这两行报错 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.这意味着 SSH 认证失败了,通常是因为本地机器的 SSH 密钥未被 GitHub 账户识别/未正确设置。在终端中使用 ssh -T gitgithub.com 可以…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。 当消息没有到交换机就失败了,就会返回publish-confirm。当消息没有到达MQ时&…

2_怎么看原理图之协议类接口之UART笔记

通信双方先约定通信速率,如波特率115200 一开始时,2440这边维持高电平 1> 开始发送时,由2440将(RxD0)高电平拉低,并持续一个T的时间(为了让PC机可以反应过来),T1/波…

常用软件下载地址

Git: Git - Downloading Package TortoiseGit: download.TortoiseGit.org – Index of /tgit/

ubuntu22 编译 SIBR 3dgs

1.clone 代码 git clone https://github.com/graphdeco-inria/gaussian-splatting.git --recursive 2.基础库文件安装 sudo apt install -y libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3…

代码随想录算法训练营第三天

● 自己看到题目的第一想法 203.移除链表元素 方法一: 思路: 设置虚拟头节点 dummyhead 设置临时指针 cur 遍历 整个链表 循环: 如果 cur !nullptr &&cur->next !nullptr 则 遍历链表 否则结束遍历 如果 cur->next val 则…

整理ArrayList和LinkedList中的方法

ArrayList 和 LinkedList 是 Java 中两种常用的列表(List)实现。它们提供了许多相同的方法,但由于内部实现的不同,这些方法的性能可能会有所不同。以下是一些常用的方法: 添加元素 add(E e): 在列表的末尾添加一个元…