设计模式10、外观模式Facade
 
#pragma once
#include <iostream>
#include <string>
#include <windows.h>
const std::string c_stateToStrCourier[] = { "收到", "验证可达性", "分配人员", "派送包裹", "获取交货确认", "完成" };
const std::string c_stateToStrVendor[] = { "收到", "确认库存", "从仓库得到物品", "包装", "联系快递员", "完成" };
const std::string c_stateToStrOrderTeam[] = { "收到", "确认付款", "联系供应商", "完成" };
const int c_nMsec = 300;  // 休眠时间(毫秒) - Sleep(c_nMsec) 处可以替换为一些有用的代码
// 订单团队
class OrderTeam
{
public:void submitRequest() {m_nState = 0;}// 检测状态bool checkStatus() {std::cout << "订单团队 - 当前状态:" <<  c_stateToStrOrderTeam[m_nState] << std::endl;Sleep(c_nMsec);m_nState++;return (m_nState == Complete);}
private:enum States {Received,  // 收到VerifyPayment,  // 确认付款ContactVendor,  // 联系供应商Complete  // 完成};int m_nState;
};
// 供应商
class Vendor
{
public:void submitRequest() {m_nState = 0;}// 检测状态bool checkStatus() {std::cout << "供应商 - 当前状态:" << c_stateToStrVendor[m_nState] <<  std::endl;Sleep(c_nMsec);m_nState++;return (m_nState == Complete);}
private:enum States {Received,  // 收到VerifyInventory,  // 确认库存GetItemFromWareHouse,  // 从仓库得到物品PackItem,  // 包装ContactCourier,  // 联系快递员Complete  // 完成};int m_nState;
};
// 快递员
class Courier
{
public:// 将请求转发给快递员void submitRequest() {m_nState = 0;}// 检测状态bool checkStatus() {std::cout << "快递员 - 当前状态:" << c_stateToStrCourier[m_nState]  << std::endl;Sleep(c_nMsec);m_nState++;return (m_nState == Complete);}
private:enum States {Received,  // 收到VerifyReachbility,  // 验证可达性AssignPerson,  // 分配人员DispatchPackage,  // 派送包裹GetDeliveryConfirmation,  // 获取交货确认Complete  // 完成};int m_nState;
};#pragma once
#include "sub_system.h"
// 网购外观
class OnlineShoppingFacade
{
public:OnlineShoppingFacade() {m_nCount = 0;}// 返回跟踪次数int followupNum() {return m_nCount;}// 提交订单void submitRequest() {m_nState = 0;}// 跟踪订单bool checkStatus() {// 收到订单请求switch (m_nState) {case Received:m_nState++;// 将请求转发给订单团队m_order.submitRequest();std::cout << "********** 提交给订单团队,跟踪次数:" <<  m_nCount << " **********" << std::endl;break;case SubmittedToOrderTeam:// 如果订单团队完成验证,则向供应商发出请求if (m_order.checkStatus()) {m_nState++;m_vendor.submitRequest();std::cout << "********** 提交给供应商,跟踪次数:" <<  m_nCount << " **********" << std::endl;}break;case SubmittedToVendor:// 如果供应商已将包裹打包,将其转发给快递员if (m_vendor.checkStatus()) {m_nState++;m_courier.submitRequest();std::cout << "********** 提交给快递员,跟踪次数:" <<  m_nCount << " **********" << std::endl;}break;case SubmittedToCourier:// 如果包裹交付,订单完成if (m_courier.checkStatus())return true;default:break;}m_nCount++;// 订单未完成return false;}
private:enum States {Received,  // 收到SubmittedToOrderTeam,  // 提交给订单团队SubmittedToVendor,  // 提交给供应商SubmittedToCourier  // 提交给快递员};int m_nState;  // 订单状态int m_nCount;  // 跟踪次数OrderTeam m_order;Vendor m_vendor;Courier m_courier;
};#include "facade.h"
int main()
{OnlineShoppingFacade facade;// 提交订单facade.submitRequest();// 跟踪订单,直到订单完成while (!facade.checkStatus());std::cout << "********** 订单完成,跟踪次数:" << facade.followupNum() << "  **********" << std::endl;getchar();return 0;
}
 
相关文章:
设计模式10、外观模式Facade
解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用 外观(Facade)角色:为多个子系统对外提供…...
华为数通方向HCIP-DataCom H12-831题库(单选题:181-200)
第181题 以下关于OSPF的5类LSA中的转发地址(ForwardingAddress,FA) 的描述,正确的是哪一项? A、当FA地址为0.0.0.0时,收到该LSA的路由器认为到达目的网段的数据包应该发往对应的ABR,因此将到达ABR的下一跳地址作为这条外部路由的下一跳 B、当FA地址为0.0.0.0时,收到该LS…...
Java 中的参数传递方式
Java 中的参数传递方式通常被称为“值传递”,这意味着在方法调用时,实际上传递给方法的是变量的副本,而不是变量本身。尽管这被广泛称为“值传递”,但需要注意的是,这并不意味着 Java 不支持引用传递。事实上ÿ…...
从0开始python学习-27.selenium 简单登录页面脚本
url https://test.com.cn/login driver.get(url)# 获取登录页面需要输入账号密码进行模拟登录操作 user driver.find_element(By.XPATH,//*[id"username"]).send_keys(username) pwd driver.find_element(By.XPATH,//*[id"selfpwd"]).send_keys(123456)…...
华为智能企业上网行为管理安全解决方案(2)
本文承接: https://blog.csdn.net/qq_37633855/article/details/133339254?spm1001.2014.3001.5501 重点讲解华为智能企业上网行为管理安全解决方案的部署流程。 华为智能企业上网行为管理安全解决方案(2) 课程地址方案部署整体流程组网规划…...
【python海洋专题九】Cartopy画地形等深线图
【python海洋专题九】Cartopy画地形等深线图 水深图基础差不多了,可以换成温度、盐度等 本期加上等深线 本期内容 1:地形等深线 cf ax.contour(lon, lat, ele[:, :], levelsnp.linspace(-9000,-100,10),colorsgray, linestyles-,linewidths0.25, t…...
Java后端模拟面试,题集①
1.Spring bean的生命周期 实例化 Instantiation属性赋值 Populate初始化 Initialization销毁 Destruction 2.Spring AOP的创建在bean的哪个时期进行的 (图片转载自Spring Bean的完整生命周期(带流程图,好记)) 3.MQ如…...
UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】
目录 了解相关的函数 第一种做法:自定义添加选择资产的前缀或后缀 代码 效果 第二种做法:通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中,我们创建了插件,用来扩展编辑器的使用: …...
短期风速预测|LSTM|ELM|批处理(matlab代码)
目录 1 主要内容 LSTM-长短时记忆 ELM-极限学习机 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序是预测类的基础性代码,程序对河北某地区的气象数据进行详细统计,程序最终得到pm2.5的预测结果,通过更改数据很容易得到风速预测结…...
【LeetCode热题100】--102.二叉树的层序遍历
102.二叉树的层序遍历 广度优先搜索: 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类&…...
第44节——redux store
一、概念 Redux 是一个用于管理 JavaScript 应用状态的库。在 Redux 中,整个应用的状态都存储在一个对象中,称为 store。 Store 实际上是一个 JavaScript 对象,它存储了整个应用的状态。它是唯一的,意味着应用中只有一个 store。…...
【2023年11月第四版教材】第17章《干系人管理》(第二部分)
第17章《干系人管理》(第二部分) 4 过程1-识别干系人4.1 数据收集★★★4.3数据分析4.4 权力利益方格4.5 数据表现:干系人映射分析和表现★★★ 5 过程2-规划干系人参与5.1 数据分析5.2 数据表现★★★5.2.1 干系人参与度评估矩阵★★★ 5.3 …...
含分布式电源的配电网可靠性评估(matlab代码)
目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考《基于仿射最小路法的含分布式电源配电网可靠性分析》文献方法,通过概率模型和时序模型分别进行建模,实现基于概率模型最小路法的含分布式电源配电网可靠性评估以及时序模型…...
react的组件
组件 组件是用来实现局部功能的代码和资源的集合(html/css/js),用来复用代码。 react中分为函数式组件和类式组件。函数式组件就是一个函数,函数的返回值就是组件的视图内容。类式组件就是通过class关键字创建的类,类…...
低功耗引擎Cliptrix为什么可以成为IOT的高效能工具
在万物互联的时代,现代人已普遍接受电视、音箱等电器设备具备智能化能力,也是在这个趋势下,我们身边越来越多的iOT设备联网和交互成为刚需。 但iot设备也面临到一些非常显著的痛点,例如iot设备的内存、处理器等核心元件无法与手机…...
深入学习git
1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一:你正在当前分支A开发&…...
第9章 Mybatis
9.1 谈谈你对Mybatis的理解 难度:★★ 重点:★★ 白话解析 说清楚Mybatis是什么,它的工作流程,然后再对比一下Hibernate就好了。 1、Mybatis是什么:它一个半自动ORM框架,它底层把JDBC那套加载驱动、创建连接、创建statement等重复性的硬编码全部给你封装好了,程序员只…...
隐蔽通信论文复现
文章目录 前言一、Limits of Reliable Communication with Low Probability of Detection on AWGN Channels摘要introduction 前言 本文准备先考虑隐蔽中通信经典的Alice, Bob, Willie三点模型, 总结出其中的经典套路 一、Limits of Reliable Communication with Low Probabil…...
《Vue.js+Spring Boot全栈开发实战》简介
大家好,我是老卫。 恰逢中秋国庆双节,不想出门看人山,惟愿宅家阅书海! 今天开箱的这本书是《Vue.jsSpring Boot全栈开发实战》。 外观 从书名故名思议,就是基于Vue.jsSpring Boot来实现企业级应用全栈开发。 该书由…...
机器人中的数值优化(二十)——函数的光滑化技巧
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
