设计模式之门面模式(C++)

简介: 设计模式之门面模式(C++)

一、门面模式是什么?

      门面模式是一种结构型的软件设计模式,也叫外观模式,它提供了统一的接口去访问多个子系统的接口。举个例子,一个餐馆里有许多角色,每个角色就是一个子系统,餐馆就是总系统,客人来餐馆只需要按要求点餐,不需要管餐馆是怎么运作的。


      门面模式的优点:


  1. 简洁易使用。为复杂的模块和系统提供了一个简单的接口,简易化操作。
  2. 保证了子系统独立性。子系统间独立性良好,彼此间一般不受影响,如何使用由门面决定。
  3. 保证了系统稳定性。当直接使用子系统,可能会出现无法预知的异常时,门面模式可通过高层接口规范子系统接口的调用,且有效阻隔子系统和客户端间的交互,进而增强系统鲁棒性。
  4. 隐秘性好。门面将子系统的具体细节都封装了起来。

     门面模式的缺点:


  1. 不符合开闭原则。添加新系统要对门面进行修改。
  2. 对开发者要求高。开发者需要了解子系统间的业务逻辑关系,这样才能确保封装的高层接口是有效且稳定的。

二、门面模式

2.1 结构图

      客户端即Main主函数,门面就是个总系统,里面管理着多个子系统。

2.2 代码示例

      场景描述:去餐馆吃饭。

//Facade.h
/****************************************************/
#pragma once
#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;
// 厨师
class Cook
{
public:
  // 炒菜
  void cookMeal(vector<string> menu) {
    for (int i = 0; i < menu.size(); ++i) {
      cout << "正在炒:" << menu[i] << endl;
    }
  }
};
// 服务员
class Waiter
{
public:
  // 点菜
  void orderDishes(vector<string> menu) {
    for (int i = 0; i < menu.size(); ++i) {
      cout << "点菜:" << menu[i] << endl;
    }
  }
  // 收拾
  void clear() {
    cout << "打扫卫生。" << endl;
  }
};
// 前台
class Reception
{
public:
  // 欢迎
  void welcome() {
    cout << "欢迎光临!" << endl;
  }
  // 买单
  void bill() {
    cout << "买单完成,欢迎下次再来!" << endl;
  }
};
// 门面
class Facade
{
public:
  // 构造函数
  Facade() {
    m_cook = new Cook();
    m_waiter = new Waiter();
    m_reception = new Reception();
  }
  // 析构函数
  ~Facade() {
    if (m_cook != nullptr) {
      delete m_cook;
      m_cook = nullptr;
    }
    if (m_waiter != nullptr) {
      delete m_waiter;
      m_waiter = nullptr;
    }
    if (m_reception != nullptr) {
      delete m_reception;
      m_reception = nullptr;
    }
  }
  // 经营
  void manage(vector<string> menu) {
    // 欢迎
    m_reception->welcome();
    // 服务员点菜
    m_waiter->orderDishes(menu);
    // 厨师炒菜
    m_cook->cookMeal(menu);
    // 客人用餐
    cout << "客人用餐中。" << endl;
    // 买单
    m_reception->bill();
    // 打扫卫生
    m_waiter->clear();
  }
private:
  Cook *m_cook;
  Waiter *m_waiter;
  Reception *m_reception;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Facade.h"
using namespace std;
int main()
{
  Facade *facade = new Facade();
  // 餐馆运营
  vector<string> menu = { "红烧肉","土豆丝","酸菜鱼" };
  facade->manage(menu);
  delete facade;
  facade = nullptr;
  return 0;
}

   程序结果如下。

      门面模式是应用比较广泛的一种设计模式,比如在一些对专业技术有要求的行业里,整个技术路线是庞大复杂且精妙的,一套技术路线中涵盖了多种子技术,这类场景下用门面模式,就能很好地实现算法库的封装。


      像在我的工作中,因为我司设计的算法库往往需要涵盖几十甚至更多的功能类,各个类组合起来就能实现一些工程上的技术,若不对其进行组合封装,则调用算法库的软件工程师(不具备专业技术背景)就不知道如何使用了。而通过门面模式可以将复杂的功能封装起来,只提供一个高层接口给软件部门,软件工程师只需要按照算法给定的要求调用接口即可。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对门面模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解门面模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
6月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
68 1
|
6月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
138 0
|
6月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
92 0
|
6月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
250 0
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
42 3
|
4月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
54 2
|
6月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
60 2
|
6月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
211 1
|
6月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
519 1
|
6月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
66 1