系列文章总结一些比较常见的设计模式,外观模式是由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++]外观模式相关推荐

  1. JS常用的设计模式(7)—— 外观模式

    JS常用的设计模式(7)-- 外观模式 外观模式(门面模式),是一种相对简单而又无处不在的模式.外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用. 用一段再简单不过的代码来表示 var ...

  2. Swift 中的设计模式 #3 外观模式与适配器模式

    作者:Andrew Jaffee,原文链接,原文日期:2018-09-04 译者:郑一一:校对:BigNerdCoding,pmst,Forelax:定稿:Forelax 本文是我的设计模式系列教程的 ...

  3. Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  4. 移动开发 | Swift 中的设计模式 #3 外观模式与适配器模式

    本文是我的设计模式系列教程的第三篇.在第一篇文章中,我介绍了 创建型模式中的工厂模式和单例模式.在第二篇文章中,又讨论了一下 行为型模式中的观察者模式和备忘录模式. 在本文中,我会就结构型模式中的外观 ...

  5. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  6. 研磨设计模式之外观模式(Facade)(解决方案)

    3.2  解决方案 3.2.1  外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...

  7. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  9. 【设计模式】外观模式 ( 概念 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 I . 外观模式概念 II . 外观模式 适用场景 III . 外观模式 优缺点 IV . 外观模式与其它设计模式的联系与区别 V . 外观模式 代码示例 I . 外观模式概念 1 . 外观 ...

最新文章

  1. 句法模式识别(两)-正规文法、上下文无关文法
  2. 如何将mysql卸载干净
  3. Linux下ps查找进程用kill终止命令
  4. AppServ安装到一半卡住的问题
  5. String类型转date
  6. winform 转 JAVA_C#转java
  7. 随机对照试验设计有哪些先天优势?
  8. 3ds max 渲染清晰面片的边缘
  9. oracle rownum 特别慢,select * from table where rownum=1怎么会特别慢??表的数据在千万左右...
  10. 多核编程与单核多线程编程
  11. java集合——java.util.Properties类
  12. 速览Java 7 MethodHandle及其用法
  13. 【基础学习】操作系统学习笔记 - 内存管理:内存使用与分段、内存分区与分页、多级页表、快表、段页式内存管理的实现、内存的换入换出
  14. Threejs HDR
  15. win7 可以装matlab 吗,win7系统怎么安装matlab软件(图文教程)
  16. 写给大家看的CSS书,写给大家看的设计书
  17. Latex去除正文中的章节编号但同时在目标中保留索引
  18. 计算机中丢失storm.d,win10 64位电脑缺少storm.dll怎么办_win10玩暗黑破坏神2缺少storm.dll文件修复方法...
  19. YOLOv5 Head解耦
  20. 牛逼!StarRocks 2.0正式发布,新一年,新启航,新极速!

热门文章

  1. python语言提供的3个基本数字类型是什么_计算机二级python学习教程(3) python语言基本数据类型...
  2. 读论文-MHFormer
  3. 斐波那契之兔子问题解释
  4. Tinker edge R 烧写 Debian 10 V2.0.5 镜像
  5. 共享出行业务下的高并发场景
  6. SAP 发布 REST 接口「实例」
  7. 局域网共享设置软件_如何使用局域网共享打印机 局域网共享打印机设置方式【详解】...
  8. msdn win10镜像获取
  9. 快来试试这几个手机的实用小技巧吧
  10. 传输协议之ICMP详解