[设计模式C++]外观模式
系列文章总结一些比较常见的设计模式,外观模式是由GoF提出的23种设计模式的一种,使用非常简单。
2021-09-16
- 增加一个例子
- 区别于代理模式,都像是插入第三者,但是外观模式是统筹管理子系统,就好像进行一个一键设置。代理模式是接口一样,有一个基类。
文章目录
- 外观模式(门面模式)概念
- 结构和三个角色
- 举个例子
- 需求及代码实现
- 总结
外观模式(门面模式)概念
根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
Facade模式也叫外观模式。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供-个一致的简单的界面。这个一致的简单的界面被称作 facade.
定义中提到的子系统是指在设计中为了降低复杂性根据一定的规则(比如业务、功能),对系统进行的划分。子系统中封装有- -些类。客户程序在使用子系统的时候,可能会像下图.一样零乱。
在上面的实现方法中,客户类紧紧地依赖在子系统的实现上。子系统发生的变化,很可能要影响到客户类的调用。而且子系统在不断优化、可重用化的重构路上,会产生更多更小的类。这对使用子系统的客户类来说要完成-一个工作流程,似乎要记住的接口太多了。
门面模式就是为了解决这种问题而产生的。看看使用了门面模式后的图:
这样就减少了客户程序和子系统之间的耦合,增加了可维护性
结构和三个角色
- 门面角色(facade): 这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。.
- 子系统角色:实现了子系统的功能。对它而言,facade角色就和客户角色一样是未知的,.它没有任何facade角色的信息和链接。
- 客户角色:调用facade角 色来完成要得到的功能。
举个例子
- 比如医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。
解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。 - 第二个例子就是下面的代码
需求及代码实现
游戏模式和ktv模式实现一致,代码中不再重复体现
# include<iostream>
using namespace std;//电视机
class Television
{public:void On(){cout<<"电视机打开..."<<endl;}void Off(){cout << "电视机关闭..." << endl;}
};
//灯
class Light
{public:void On(){cout << "灯打开..." << endl;}void Off(){cout << "灯关闭..." << endl;}
};
//音箱
class Audio
{public:void On(){cout << "音箱打开..." << endl;}void Off(){cout << "音箱关闭..." << endl;}
};
//DVD播放器
class DvDPlayer
{public:void On(){cout << "DVD打开..." << endl;}void Off(){cout << "DVD关闭..." << endl;}
};
//麦克风
class Mircophone
{public:void On(){cout << "麦克风打开..." << endl;}void Off(){cout << "麦克风关闭..." << endl;}
};
//ktv模式
class KTVMode
{public:
public:KTVMode(){pTelevision = new Television;pLight = new Light;pAudio = new Audio;pMircophone = new Mircophone;pDvDPlayer=new DvDPlayer;}~KTVMode(){delete pTelevision;delete pLight;delete pAudio;delete pMircophone;delete pDvDPlayer;}//ktv模式 启动 统一管理各个系统void runktv(){pTelevision->On();pLight->Off();pAudio->On();pMircophone->On();pDvDPlayer->On();}//ktv模式 关闭 统一管理各个系统void offktv(){pTelevision->Off();pLight->On();pAudio->Off();pMircophone->Off();pDvDPlayer->Off();}private:Television* pTelevision;Light* pLight;Audio* pAudio;Mircophone* pMircophone;DvDPlayer* pDvDPlayer;
};int main()
{KTVMode* p = new KTVMode;p->runktv();p->offktv();return 0;
}
总结
整体感觉就是,使用简单,但是又很关键和方便。 如有错误,欢迎指出。
[设计模式C++]外观模式相关推荐
- JS常用的设计模式(7)—— 外观模式
JS常用的设计模式(7)-- 外观模式 外观模式(门面模式),是一种相对简单而又无处不在的模式.外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用. 用一段再简单不过的代码来表示 var ...
- Swift 中的设计模式 #3 外观模式与适配器模式
作者:Andrew Jaffee,原文链接,原文日期:2018-09-04 译者:郑一一:校对:BigNerdCoding,pmst,Forelax:定稿:Forelax 本文是我的设计模式系列教程的 ...
- Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程
Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍 随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...
- 移动开发 | Swift 中的设计模式 #3 外观模式与适配器模式
本文是我的设计模式系列教程的第三篇.在第一篇文章中,我介绍了 创建型模式中的工厂模式和单例模式.在第二篇文章中,又讨论了一下 行为型模式中的观察者模式和备忘录模式. 在本文中,我会就结构型模式中的外观 ...
- 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)
如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧: 分别是瑞雯和 ...
- 研磨设计模式之外观模式(Facade)(解决方案)
3.2 解决方案 3.2.1 外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...
- 设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)
前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...
- 【设计模式】外观模式 ( 概念 | 适用场景 | 优缺点 | 代码示例 )
文章目录 I . 外观模式概念 II . 外观模式 适用场景 III . 外观模式 优缺点 IV . 外观模式与其它设计模式的联系与区别 V . 外观模式 代码示例 I . 外观模式概念 1 . 外观 ...
最新文章
- 句法模式识别(两)-正规文法、上下文无关文法
- 如何将mysql卸载干净
- Linux下ps查找进程用kill终止命令
- AppServ安装到一半卡住的问题
- String类型转date
- winform 转 JAVA_C#转java
- 随机对照试验设计有哪些先天优势?
- 3ds max 渲染清晰面片的边缘
- oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...
- 多核编程与单核多线程编程
- java集合——java.util.Properties类
- 速览Java 7 MethodHandle及其用法
- 【基础学习】操作系统学习笔记 - 内存管理:内存使用与分段、内存分区与分页、多级页表、快表、段页式内存管理的实现、内存的换入换出
- Threejs HDR
- win7 可以装matlab 吗,win7系统怎么安装matlab软件(图文教程)
- 写给大家看的CSS书,写给大家看的设计书
- Latex去除正文中的章节编号但同时在目标中保留索引
- 计算机中丢失storm.d,win10 64位电脑缺少storm.dll怎么办_win10玩暗黑破坏神2缺少storm.dll文件修复方法...
- YOLOv5 Head解耦
- 牛逼!StarRocks 2.0正式发布,新一年,新启航,新极速!
热门文章
- python语言提供的3个基本数字类型是什么_计算机二级python学习教程(3) python语言基本数据类型...
- 读论文-MHFormer
- 斐波那契之兔子问题解释
- Tinker edge R 烧写 Debian 10 V2.0.5 镜像
- 共享出行业务下的高并发场景
- SAP 发布 REST 接口「实例」
- 局域网共享设置软件_如何使用局域网共享打印机 局域网共享打印机设置方式【详解】...
- msdn win10镜像获取
- 快来试试这几个手机的实用小技巧吧
- 传输协议之ICMP详解