C++设计模式-外观模式 原创 设计模式 2021年10月25日 12:02 夏至未至 1283 当前内容 5458 字,在路上,马上到,马上到 ### 目录 [TOC] ### 外观模式介绍 #### 何为外观模式 为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,保证接口的可复用性。通过一个合理的外观角色,能够比较好地兼容接口的复用性和易用性。 #### 外观模式关注点 需要将接口设计得细粒度一点,职责单一点,如果接口的粒度过小,在使用接口开发一个业务功能时,就会导致需要调用 很多细粒度的接口才能完成(文末main中有用例)。相反,如果接口粒度设计得太大,一个接口返回很多数据,要做很多事情,就会导致接口不够通用、可复用性、易用性不好。 #### 为何使用外观模式 解决接口的可复用性和易用性之间的矛盾;降低子系统与客户端的耦合度。 #### 如何实现外观模式 通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度 ### 应用场景 1. 提供一个简单入口,来访问一系列复杂的子系统 2. 解耦客户端程序与多个子系统,减少它们之间的依赖性,从而提高子系统的独立性和可移植性。 ### 模式特点 #### 优点 1. 外观模式使得客户端不必关心子系统组件,减少了与客户端交互的对象的数量,简化了客户端的编程; 2. 外观模式降低子系统与客户端的耦合度; 3. 子系统的变化并不需要修改客户端,只需要适当修改外观类即可; 4. 子系统之间不会相互影响,而且子系统内部变化也不会影响到外观对象。 #### 缺点 1. 如果需要增加或者减少子系统,需要修改外观类,违反开闭原则;解决方法:引入抽象外观类,客户端可以针对抽象外观类进行编程,对于新的业务需求,不需要修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象。 2. 不能限制客户端直接与子系统交互,但如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。 ### 模式角色类 - Facade(外观角色): 外观角色可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。 - SubSystem(子系统角色): 在软件系统中的子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。 ### 上机实操 #### 代码场景 奥迪Q8 RS有很多子系统,操作系统、动力系统、安全系统、联网系统,然后买了四个系统,回来自己组装,估计就能开了。但是难上路,但是在4s买的,就省事了,还能上路,就是被宰的厉害 #### 实际代码 #include // 场景:奥迪Q8 RS有很多子系统,操作系统、动力系统、安全系统、联网系统,然后买了四个系统,回来自己组装,估计就能开了。但是难上路,但是在4s买的,就省事了,还能上路,就是被宰的厉害 // SubSystem(子系统角色) // SubSystem(子系统角色):OperatingSystem、PowerSystem、SecuritySystem、NetworkingSystem class OperatingSystem { public: OperatingSystem() { std::cout << "操作系统被创建" << std::endl; } ~OperatingSystem() { std::cout << "操作系统被销毁" << std::endl; } void buyOperatingSystem(std::string buyer) { std::cout << buyer << " 买汽车操作系统" << std::endl; } }; class PowerSystem { public: PowerSystem() { std::cout << "动力系统被创建" << std::endl; } ~PowerSystem() { std::cout << "动力系统被销毁" << std::endl; } void buyPowerSystem(std::string buyer) { std::cout << buyer << " 买汽车动力系统" << std::endl; } }; class SecuritySystem { public: SecuritySystem() { std::cout << "安全系统被创建" << std::endl; } ~SecuritySystem() { std::cout << "安全系统被销毁" << std::endl; } void buySecuritySystem(std::string buyer) { std::cout << buyer << " 买汽车安全系统" << std::endl; } }; class NetworkingSystem { public: NetworkingSystem() { std::cout << "车联网系统被创建" << std::endl; } ~NetworkingSystem() { std::cout << "车联网系统被销毁" << std::endl; } void buyNetworkingSystem(std::string buyer) { std::cout << buyer << " 买汽车联网系统" << std::endl; } }; // Facade(外观角色) // ShopCarBy4S:提供一个简单入口,来访问一系列复杂的子系统 class ShopCarBy4S { public: ShopCarBy4S() { std::cout << "4S店被创建" << std::endl; operatingSystem = new OperatingSystem(); powerSystem = new PowerSystem(); securitySystem = new SecuritySystem(); networkingSystem = new NetworkingSystem(); } ~ShopCarBy4S() { delete networkingSystem; delete securitySystem; delete powerSystem; delete operatingSystem; std::cout << "4S店被炸毁" << std::endl; }; void sellQ8Car() { std::cout << "奥迪4S店主备卖车..." << std::endl; operatingSystem->buyOperatingSystem("4S店"); powerSystem->buyPowerSystem("4S店"); securitySystem->buySecuritySystem("4S店"); networkingSystem->buyNetworkingSystem("4S店"); std::cout << "各系统拆分进口完成,组装好,成功卖出,宰的尊贵的奥迪车主没怨言" << std::endl; } private: OperatingSystem* operatingSystem = nullptr; PowerSystem* powerSystem = nullptr; SecuritySystem* securitySystem = nullptr; NetworkingSystem* networkingSystem = nullptr; }; // 测试 int main() { std::cout << "网站:https://www.codecomeon.com/" << std::endl; std::cout << std::endl; // 如果我个人买车,是这样的(过程很繁琐,客户端和子系统间依赖性高) std::cout << "----个人买车----" << std::endl; auto operatingSystem = new OperatingSystem(); auto powerSystem = new PowerSystem(); auto securitySystem = new SecuritySystem(); auto networkingSystem = new NetworkingSystem(); operatingSystem->buyOperatingSystem("正在看代码的你"); powerSystem->buyPowerSystem("正在看代码的你"); securitySystem->buySecuritySystem("正在看代码的你"); networkingSystem->buyNetworkingSystem("正在看代码的你"); delete networkingSystem; delete securitySystem; delete powerSystem; delete operatingSystem; // 如何还想加系统,继续得再客户端这里改 std::cout << "----买好组装完成----" << std::endl; std::cout << std::endl; std::cout << "----外观模式示例----" << std::endl; // 为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度 auto* shop4s = new ShopCarBy4S(); shop4s->sellQ8Car(); delete shop4s; return 0; } #### 执行输出  本文标题: C++设计模式-外观模式 本文作者: 夏至未至 发布时间: 2021年10月25日 12:02 最近更新: 2022年2月25日 15:52 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 上一个 C++设计模式-享元模式 下一个 C++设计模式-装饰器模式 当前文章评论暂未开放,请移步至留言处留言。