当前位置: 首页 > news >正文

设计模式——外观模式

一、定义与概念

  • 定义
    C++ 外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,这个接口使得子系统更易于使用。通过将复杂的子系统封装在一个简单的外观类中,外观模式简化了客户端与子系统之间的交互。
  • 核心思想
    隐藏子系统的复杂性,将多个子系统的交互和调用逻辑封装在一个外观类中。客户端只需要与外观类进行交互,而不需要了解子系统内部的细节和复杂的调用关系,从而降低了客户端与子系统之间的耦合度。

二、结构和组成部分

子系统类(Subsystem Classes)

定义

这些是实现具体功能的类,它们组成了一个子系统。子系统类之间可能存在复杂的交互和依赖关系,这些关系对于客户端来说可能是难以理解和操作的。

代码示例(以家庭影院系统为例,包含三个子系统类)

功放类

class Amplifier {
public:void on() {std::cout << "Amplifier is on." << std::endl;}void setVolume(int volume) {std::cout << "Amplifier volume set to " << volume << "." << std::endl;}void off() {std::cout << "Amplifier is off." << std::endl;}
};

播放器类

class Player {
public:void on() {std::cout << "Player is on." << std::endl;}void play() {std::cout << "Player is playing." << std::endl;}void off() {std::cout << "Player is off." << std::endl;}
};

投影仪类

class Projector {
public:void on() {std::cout << "Projector is on." << std::endl;}void off() {std::cout << "Projector is off." << std::endl;}
};

外观类(Facade Class)

定义

外观类是外观模式的核心,它知道哪些子系统类负责哪些功能,并将客户端的请求转发给相应的子系统类来处理。外观类提供了一个简化的接口,隐藏了子系统类的复杂性。

代码示例(家庭影院外观类)

class HomeTheaterFacade {
private:Amplifier* amplifier;Player* player;Projector* projector;public:HomeTheaterFacade() {amplifier = new Amplifier();player = new Player();projector = new Projector();}void watchMovie() {projector->on();amplifier->on();amplifier->setVolume(10);player->on();player->play();}void endMovie() {projector->off();amplifier->off();player->off();}~HomeTheaterFacade() {delete amplifier;delete player;delete projector;}
};

三、应用场景

  • 简化复杂系统的调用
    当一个系统由多个子系统组成,且子系统之间的交互复杂时,外观模式可以提供一个简单的接口来统一操作这些子系统。例如,在一个大型企业资源规划(ERP)系统中,包含了采购、销售、库存、财务等多个子系统,通过创建一个 ERP 系统外观类,可以将复杂的业务流程操作封装起来,方便客户端(如企业管理人员)使用。
  • 分层架构中的层间交互
    在分层架构中,外观模式可以用于简化不同层之间的交互。例如,在三层架构(表示层、业务逻辑层、数据访问层)中,业务逻辑层可以作为一个外观类,将数据访问层的复杂操作(如数据库连接、查询、更新等)封装起来,为表示层提供简单、统一的接口,这样表示层不需要了解数据访问层的具体实现细节。
  • 第三方库或框架的集成
    当集成多个第三方库或框架时,这些库或框架本身可能具有复杂的接口和调用方式。通过创建一个外观类,可以将第三方库的功能整合在一起,为应用程序提供一个更易于使用的接口。例如,在一个图形处理应用程序中,集成了多个用于图像加载、处理和保存的第三方库,通过外观类可以统一这些库的操作,使应用程序更方便地使用这些功能。

四、优缺点

优点

  • 降低耦合度:
    客户端与子系统之间的耦合度大大降低,因为客户端只需要与外观类交互,而不需要了解子系统的内部细节。这使得子系统的变化不会直接影响到客户端,提高了系统的可维护性和可扩展性。
  • 提高易用性:
    为复杂的子系统提供了一个简单、统一的接口,使得客户端使用子系统更加方便。这对于复杂的业务逻辑或系统操作尤其重要,可以提高开发效率,减少错误。
  • 促进子系统的独立性和可维护性:
    由于子系统的复杂性被封装在外观类中,子系统可以独立地进行开发、测试和维护,而不会对客户端产生影响。这有助于团队分工协作,提高整个系统的开发效率。

缺点

  • 外观类可能变得复杂:
    如果子系统过于复杂,外观类可能会承担过多的责任,导致其本身变得复杂。这可能会影响外观类的可维护性,并且当子系统发生变化时,外观类可能需要进行大量的修改。
  • 不符合开闭原则:
    在某些情况下,当需要添加新的子系统功能或修改子系统的接口时,可能需要修改外观类的代码,这违反了开闭原则。不过,在实际应用中,可以通过一些设计技巧(如使用抽象外观类和具体外观类)来尽量减少这种影响。

外观模式是一种非常实用的设计模式,在处理复杂系统的简化和集成方面具有重要作用,但在使用时需要注意其优缺点,合理设计外观类和子系统的结构。


http://www.mrgr.cn/news/62168.html

相关文章:

  • Python基础学习------第一天
  • At dp综合
  • 一次性讲清楚——macOS 配置开发环境与进行应用开发!
  • 项目开发的架构模式与异步请求(AJAX)
  • linux 高级 I/O
  • CI/CD 的原理
  • isp框架代码理解
  • Vue3数据统计小组件
  • leetcode-189-轮转数组
  • list ------ 是一个带头双向循环的列表
  • [Java进阶] 调用C和C++代码利器(JNI)
  • 力扣——二叉树的后序遍历(C语言)
  • 开发中的拓展属性:增强功能与灵活性
  • SQL语言基础
  • ConcurrentSkipListSet和ConcurrentSkipListMap分析以及总结Set
  • 魔法伤害--是谁偷走了我的0
  • NEEP-EN2-2020-Section1
  • 100种算法【Python版】第28篇——扩展欧几里得算法
  • 【Linux】--- 开发工具篇:yum、vim、gcc、g++、gdb、make、makefile
  • highcharts的datalabels标签格式化
  • 【计网】网络协议栈学习总结 --- 浏览器上输入网址域名后点击回车,到底发生了什么?
  • 通过不当变更导致 PostgreSQL 翻车的案例分析与防范
  • Python金色流星雨(完整代码)
  • ubuntu 挂载 新 硬盘 ext3
  • 高等数学(数二专题)
  • 在Windows下通过pip安装Selenium