• 设计模式10、外观模式Facade


    解释说明:外观模式(Facade Pattern)又称为门面模式,属于结构型模式
    Façade 为子系统中的一组接口提供了一个统一的高层接口,该接口使得子系统更加容易使用
    外观(Facade)角色:为多个子系统对外提供一个共同的接口
    子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它
    优点:
        对 Client 屏蔽子系统组件,减少了 Client 处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,Client 的代码将变得很简单,与之关联的对象也很少。
        实现了子系统与 Client 之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的 Client,只需要调整 Facade 即可。
    降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
        只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
    缺点:
        不能很好地限制 Client 使用子系统类,如果对 Client 访问子系统类做太多的限制,则会减少可变性和灵活性。
        在不引入抽象外观类的情况下,增加新的子系统可能需要修改 Facade 或 Client 的源代码,违背了“开闭原则”。
    适用场景
        当要为一个复杂子系统提供一个简单接口时。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
    Client 与多个子系统之间存在很大的依赖性。引入外观类将子系统与 Client 以及其他子系统解耦,可以提高子系统的独立性和可移植性。
        在层次化结构中,可以使用外观模式定义系统中每一层的入口。层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. const std::string c_stateToStrCourier[] = { "收到", "验证可达性", "分配人员", "派送包裹", "获取交货确认", "完成" };
    6. const std::string c_stateToStrVendor[] = { "收到", "确认库存", "从仓库得到物品", "包装", "联系快递员", "完成" };
    7. const std::string c_stateToStrOrderTeam[] = { "收到", "确认付款", "联系供应商", "完成" };
    8. const int c_nMsec = 300; // 休眠时间(毫秒) - Sleep(c_nMsec) 处可以替换为一些有用的代码
    9. // 订单团队
    10. class OrderTeam
    11. {
    12. public:
    13. void submitRequest() {
    14. m_nState = 0;
    15. }
    16. // 检测状态
    17. bool checkStatus() {
    18. std::cout << "订单团队 - 当前状态:" << c_stateToStrOrderTeam[m_nState] << std::endl;
    19. Sleep(c_nMsec);
    20. m_nState++;
    21. return (m_nState == Complete);
    22. }
    23. private:
    24. enum States {
    25. Received, // 收到
    26. VerifyPayment, // 确认付款
    27. ContactVendor, // 联系供应商
    28. Complete // 完成
    29. };
    30. int m_nState;
    31. };
    32. // 供应商
    33. class Vendor
    34. {
    35. public:
    36. void submitRequest() {
    37. m_nState = 0;
    38. }
    39. // 检测状态
    40. bool checkStatus() {
    41. std::cout << "供应商 - 当前状态:" << c_stateToStrVendor[m_nState] << std::endl;
    42. Sleep(c_nMsec);
    43. m_nState++;
    44. return (m_nState == Complete);
    45. }
    46. private:
    47. enum States {
    48. Received, // 收到
    49. VerifyInventory, // 确认库存
    50. GetItemFromWareHouse, // 从仓库得到物品
    51. PackItem, // 包装
    52. ContactCourier, // 联系快递员
    53. Complete // 完成
    54. };
    55. int m_nState;
    56. };
    57. // 快递员
    58. class Courier
    59. {
    60. public:
    61. // 将请求转发给快递员
    62. void submitRequest() {
    63. m_nState = 0;
    64. }
    65. // 检测状态
    66. bool checkStatus() {
    67. std::cout << "快递员 - 当前状态:" << c_stateToStrCourier[m_nState] << std::endl;
    68. Sleep(c_nMsec);
    69. m_nState++;
    70. return (m_nState == Complete);
    71. }
    72. private:
    73. enum States {
    74. Received, // 收到
    75. VerifyReachbility, // 验证可达性
    76. AssignPerson, // 分配人员
    77. DispatchPackage, // 派送包裹
    78. GetDeliveryConfirmation, // 获取交货确认
    79. Complete // 完成
    80. };
    81. int m_nState;
    82. };
    83. #pragma once
    84. #include "sub_system.h"
    85. // 网购外观
    86. class OnlineShoppingFacade
    87. {
    88. public:
    89. OnlineShoppingFacade() {
    90. m_nCount = 0;
    91. }
    92. // 返回跟踪次数
    93. int followupNum() {
    94. return m_nCount;
    95. }
    96. // 提交订单
    97. void submitRequest() {
    98. m_nState = 0;
    99. }
    100. // 跟踪订单
    101. bool checkStatus() {
    102. // 收到订单请求
    103. switch (m_nState) {
    104. case Received:
    105. m_nState++;
    106. // 将请求转发给订单团队
    107. m_order.submitRequest();
    108. std::cout << "********** 提交给订单团队,跟踪次数:" << m_nCount << " **********" << std::endl;
    109. break;
    110. case SubmittedToOrderTeam:
    111. // 如果订单团队完成验证,则向供应商发出请求
    112. if (m_order.checkStatus()) {
    113. m_nState++;
    114. m_vendor.submitRequest();
    115. std::cout << "********** 提交给供应商,跟踪次数:" << m_nCount << " **********" << std::endl;
    116. }
    117. break;
    118. case SubmittedToVendor:
    119. // 如果供应商已将包裹打包,将其转发给快递员
    120. if (m_vendor.checkStatus()) {
    121. m_nState++;
    122. m_courier.submitRequest();
    123. std::cout << "********** 提交给快递员,跟踪次数:" << m_nCount << " **********" << std::endl;
    124. }
    125. break;
    126. case SubmittedToCourier:
    127. // 如果包裹交付,订单完成
    128. if (m_courier.checkStatus())
    129. return true;
    130. default:
    131. break;
    132. }
    133. m_nCount++;
    134. // 订单未完成
    135. return false;
    136. }
    137. private:
    138. enum States {
    139. Received, // 收到
    140. SubmittedToOrderTeam, // 提交给订单团队
    141. SubmittedToVendor, // 提交给供应商
    142. SubmittedToCourier // 提交给快递员
    143. };
    144. int m_nState; // 订单状态
    145. int m_nCount; // 跟踪次数
    146. OrderTeam m_order;
    147. Vendor m_vendor;
    148. Courier m_courier;
    149. };
    150. #include "facade.h"
    151. int main()
    152. {
    153. OnlineShoppingFacade facade;
    154. // 提交订单
    155. facade.submitRequest();
    156. // 跟踪订单,直到订单完成
    157. while (!facade.checkStatus());
    158. std::cout << "********** 订单完成,跟踪次数:" << facade.followupNum() << " **********" << std::endl;
    159. getchar();
    160. return 0;
    161. }

     

  • 相关阅读:
    .NET代码调优让程序占用内存减少
    基础DQL(数据查询)—— 内连接&外连接
    Linux - 常用基础指令
    jmeter-http post请求
    【docker搭建pytorch环境及常用指令】
    勇士大战恶魔?这款桌游明明是套高质量原创手办
    【visual studio】visual studio 2022 无法 复制黏贴
    网络安全: Kali Linux 使用 MSF 漏洞利用
    学习STM32第十五天
    数据湖在爱奇艺数据中台的应用
  • 原文地址:https://blog.csdn.net/u013480226/article/details/133500054