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

结构型模式之外观模式

一、概述

1、定义:为子系统的一组接口提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

2、外观模式又称为门面模式,是迪米特法则的一种具体实现

3、通过引入一个新的外观角色降低原有系统的复杂度,同时降低客户类与子系统的耦合度

二、外观模式的结构

外观模式包含以下2个角色:

1、Facade(外观角色)

2、SubSystem(子系统角色)

三、UML图

四、模式优点

1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易

2、它实现了子系统与客户端之间松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可

3、一个子系统的修改对其它子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象

五、模式缺点

1、不能很好地限制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制则减少了可变性和灵活性

2、如果设计不当,增加了新的子系统可能需要修改外观类的源代码,违背了开闭原则

六、示例代码

#include<iostream>
using namespace std;class SubSystemA
{
public:void methodA(){cout << "方法A!" << endl;}
};class SubSystemB
{
public:void methodB(){cout << "方法B!" << endl;}
};class SubSystemC
{
public:void methodC(){cout << "方法C!" << endl;}
};class Facade
{
public:Facade(){m_objA = new SubSystemA;m_objB = new SubSystemB;m_objC = new SubSystemC;}~Facade(){delete m_objA;m_objA = nullptr;delete m_objB;m_objB = nullptr;delete m_objC;m_objC = nullptr;}void method(){m_objA->methodA();m_objB->methodB();m_objC->methodC();}
private:SubSystemA* m_objA = nullptr;SubSystemB* m_objB = nullptr;SubSystemC* m_objC = nullptr;
};int main()
{Facade facade;facade.method();return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3状态管理库Pinia应用
  • C++入门基础知识28——关于【C++ 常量】
  • 论文阅读:MonoScene: Monocular 3D Semantic Scene Completion
  • Linux核心命令入门
  • 线性代数证明:把行列式的某一行(列)的k倍加到另一行(列),行列式的值不变
  • C++ TinyWebServer项目总结(7. Linux服务器程序规范)
  • ASIACRYPT 2021
  • Visual Studio VS 插件之 ReSharper
  • 网络基础-复习建议(包含红蓝对抗)
  • 高并发登录模块
  • python爬虫521
  • C++调用C#方法(附踩坑点)
  • 初识redis:Set类型
  • element-ui下拉框的使用
  • 网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)
  • @jsonView过滤属性
  • avalon2.2的VM生成过程
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • es6(二):字符串的扩展
  • fetch 从初识到应用
  • HomeBrew常规使用教程
  • javascript数组去重/查找/插入/删除
  • leetcode386. Lexicographical Numbers
  • python 装饰器(一)
  • python学习笔记-类对象的信息
  • SOFAMosn配置模型
  • Tornado学习笔记(1)
  • Vue UI框架库开发介绍
  • Vue官网教程学习过程中值得记录的一些事情
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端相关框架总和
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微信小程序设置上一页数据
  • 小程序测试方案初探
  • 栈实现走出迷宫(C++)
  • UI设计初学者应该如何入门?
  • 数据库巡检项
  • 我们雇佣了一只大猴子...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​如何防止网络攻击?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)使用竞争神经网络实现数据聚类
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (学习日记)2024.01.19
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • .“空心村”成因分析及解决对策122344