外观模式

  外观模式为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

适用性

  1.为一个复杂子系统提供一个简单接口。

  2.提高子系统的独立性。

  3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

代码示例

  假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口,比如名为Compiler的类,里面有一个名为Run的函数。客户只需调用这个函数就可以编译程序,至于Run函数内部的具体操作,客户无需知道。

#include <iostream>
using namespace std;class Scanner
{
public:  void Scan() { cout<<"词法分析"<<endl; }
}; class Parser
{
public:  void Parse() { cout<<"语法分析"<<endl; }
};  class GenMidCode
{
public:  void GenCode() { cout<<"产生中间代码"<<endl; }
};  class GenMachineCode
{
public:  void GenCode() { cout<<"产生机器码"<<endl;}
};  //高层接口
class Compiler
{
public:  void Run()   {  Scanner scanner;  Parser parser;  GenMidCode genMidCode;  GenMachineCode genMacCode;  scanner.Scan();  parser.Parse();  genMidCode.GenCode();  genMacCode.GenCode();  }
};  int main()
{  Compiler compiler;  compiler.Run();  return 0;
}  

代码示例2

  构造一个家庭影院,当启动watchMovie方法时可以看电影,当使用endMovie时关闭电影。

#include <iostream>
using namespace std;//组件类
class Amplifier
{
public:void on(){cout << "Amplifier on" << endl;}void off(){cout << "Amplifier off" << endl;}
};class Tuner
{
public:void on(){cout << "Tuner on" << endl;}void off(){cout << "Tuner off" << endl;}
};class DvdPlayer
{
public:void on(){cout << "DvdPlayer on" << endl;}void off(){cout << "DvdPlayer off" << endl;}
};class Screen
{
public:void on(){cout << "Screen on" << endl;}void off(){cout << "Screen off" << endl;}
};//家庭影院
class HomeTheaterFacade
{
public://统一接口void watchMovie(){amp.on();tuner.on();dvd.on();screen.on();}void endMovie(){amp.off();tuner.off();dvd.off();screen.off();}HomeTheaterFacade(Amplifier am,Tuner tune,DvdPlayer dv,Screen scree){amp = am;tuner = tune;dvd = dv;screen = scree;}//~HomeTheaterFacade(){}
private:Amplifier amp;Tuner tuner;DvdPlayer dvd;Screen screen;
};//客户代码
int main()
{Amplifier amp;Tuner tuner;DvdPlayer dvd;Screen screen;HomeTheaterFacade homeTheaterFacade(amp,tuner,dvd,screen);;homeTheaterFacade.watchMovie();homeTheaterFacade.endMovie();return 0;
}

结果:

Amplifier on
Tuner on
DvdPlayer on
Screen on
Amplifier off
Tuner off
DvdPlayer off
Screen off

转载于:https://www.cnblogs.com/jeakeven/p/4948090.html

设计模式 -- (7)外观模式相关推荐

  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. [设计模式C++]外观模式

    系列文章总结一些比较常见的设计模式,外观模式是由GoF提出的23种设计模式的一种,使用非常简单. 2021-09-16 增加一个例子 区别于代理模式,都像是插入第三者,但是外观模式是统筹管理子系统,就 ...

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

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

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

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

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

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

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

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

最新文章

  1. git拉取单个文件_Git拿来就用
  2. 10个python使用技巧
  3. Collections.binarySearch用法
  4. 仿微信朋友圈项目梳理
  5. python小数点进位小学数学_python小数的进位与舍去的介绍(附代码)
  6. 浅谈css3长度单位rem,以及移动端布局技巧
  7. mysql+int+类型如何模糊搜索_mysql全文模糊搜索MATCH AGAINST方法示例
  8. Aapache status / apache2ctl status 总是403
  9. PPT 去除排练计时
  10. 单循环完成快速排序(C语言)
  11. php存储富文本编辑器内容到数据库
  12. 使用Python将DOTA数据集的格式转换成VOC2007数据集的格式
  13. PDF加密如何批量解除
  14. 安全删除硬件并弹出媒体的列表中出现内置硬盘的解决办法.
  15. 一键上传文档至Google文档
  16. 手把手教你如何微信公众号开发
  17. Java 同步监视器中的 wait() 和 notify() 方法的具体实现
  18. bal插口_调音台上的英文缩写都是什么意思 调音台上面那几个插口是什么作用...
  19. [笔记]n个点的基环树数量
  20. 突破安全狗和360网站卫士

热门文章

  1. 2005年存储市场关键词TOP10
  2. php header下载中文名称,PHP Header下载文件在IE文件名中文乱码问题
  3. C 盘FAT32变为 RAW 格式
  4. OpenCV像素点处理 1
  5. Opencv3.0+vs2015
  6. vue中引入jquery
  7. 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),里面很多涉及到CSS3的一些属性。
  8. Java 技术篇-利用exe4j工具生成exe文件实例演示,IntelliJ IDEA将项目转化为jar包方法,运行生成后的程序弹出exe4j提示处理,生成的程序显示控制台设置方法
  9. Python 入门篇-最新版python3.7.2的安装。
  10. Python 微信机器人:itchat库识别消息来源于群聊还是个人