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

门面模式(C++)

定义

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

应用场景

在这里插入图片描述

  • 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
  • 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

结构

在这里插入图片描述

代码示例

//Facade.h
/****************************************************/
#ifndef FACADE_H
#define FACADE_H
#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;
};#endif
//test.cpp
/****************************************************/
#include "Facade.h"
int main()
{Facade *facade = new Facade();// 餐馆运营vector<string> menu = { "红烧肉","土豆丝","酸菜鱼" };facade->manage(menu);delete facade;facade = nullptr;return 0;
}

运行结果
在这里插入图片描述

要点总结

  • 从客户程序的角度来看,Facade模式简化 了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一-种“ 解耦 ”的效果——内部子系统的任何变化不会影响到Facade接口的变化。
  • Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
  • Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。
http://www.lryc.cn/news/113733.html

相关文章:

  • ASP.NET Core SignalR
  • auto-changelog的简单使用
  • map 比较(两个map的key,value 是否一样)
  • LayUI之入门
  • 【Linux】Linux下git的使用
  • QT读写配置文件
  • 【计算机网络】12、frp 内网穿透
  • Pytest 重复执行用例插件----pytest-repeat
  • 【软件工程】5 ATM系统测试
  • opencv读取MP4文件和摄像头数据
  • Qt实现自定义QDoubleSpinBox软键盘
  • 小研究 - 微服务系统服务依赖发现技术综述(一)
  • 2023-08-07力扣今日八题
  • Segment Anything【论文翻译】
  • 银河麒麟QT连接DM8数据库
  • 并发编程1:线程安全性概述
  • (论文复现)DeepAnt模型复现及应用
  • 【机器学习】在 MLOps构建项目 ( MLOps2)
  • 【MySQL】聚合函数与分组查询
  • conda 环境 numpy 安装报错需要 Microsoft Visual C++ 14.0
  • 算法工程师-机器学习面试题总结(5)
  • 论文阅读 RRNet: A Hybrid Detector for Object Detection in Drone-captured Images
  • js执行机制
  • 关于策略模式的注入问题
  • 通用Mapper的四个常见注解
  • 二进制安装K8S(单Master集群架构)
  • 基于java汽车销售分析与管理系统设计与实现
  • Glass指纹识别工具,多线程Web指纹识别工具-Chunsou
  • BIO,NIO,AIO总结
  • [腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统