外观(facade)模式:门面模式,结构型模式。目的:隔离接口——中间层。迪米特法则

一:一个配置相关的范例

//#include <boost/type_index.hpp>
using namespace std;
//#pragma warning(disable : 4996) namespace nmsp1
{//图形相关类class graphic{//-------------单件类实现相关begin--------------private:graphic() {};graphic(const graphic& tmpobj);graphic& operator=(const graphic& tmpobj);~graphic() {};public:static graphic& getInstance(){static graphic instance;return instance;}//-------------单件类实现相关end--------------public:void display(bool enable)  //是否全屏显示(true:是){cout << "图形->是否全屏显示->" << enable << endl;//其他代码略......}void effect(bool enable)  //是否开启特效(true:是){cout << "图形->是否开启特效->" << enable << endl;}void resolution(int index)  //设置窗口分辨率{cout << "图形->分辨率设置选项->" << index << endl;}void antialiasing(bool enable)  //是否开启抗锯齿(true:是){cout << "图形->是否开启抗锯齿->" << enable << endl;}//....其他接口略};//声音相关类class sound{//-------------单件类实现相关begin--------------private:sound() {};sound(const sound& tmpobj);sound& operator=(const sound& tmpobj);~sound() {};public:static sound& getInstance(){static sound instance;return instance;}//-------------单件类实现相关end--------------public:void bgsound(bool enable)  //是否开启背景声音(true:是){cout << "声音->是否开启背景声音->" << enable << endl;}void envirsound(bool enable)  //是否开启环境音效(true:是){cout << "声音->是否开启环境音效->" << enable << endl;}void expsound(bool enable)  //是否开启表情声音(true:是){cout << "声音->是否开启表情声音->" << enable << endl;}void setvolume(int level)  //音量大小设置(0-100){cout << "声音->音量大小为->" << level << endl;}//......其他接口略};//语音聊天相关类class chatvoice{//-------------单件类实现相关begin--------------private:chatvoice() {};chatvoice(const chatvoice& tmpobj);chatvoice& operator=(const chatvoice& tmpobj);~chatvoice() {};public:static chatvoice& getInstance(){static chatvoice instance;return instance;}//-------------单件类实现相关end--------------public:void micvolume(int level)  //麦克风音量大小设置(0-100){cout << "语音聊天->麦克风音量大小为->" << level << endl;}void micsens(int level)  //麦克风灵敏度设置(0-100){cout << "语音聊天->麦克风灵敏度为->" << level << endl;}void chatvolume(int level)  //聊天音量设置(0-100){cout << "语音聊天->聊天音量为->" << level << endl;}//......其他接口略};
}int main()
{_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口nmsp1::graphic& g_gp = nmsp1::graphic::getInstance();g_gp.display(false);g_gp.effect(true);g_gp.resolution(2);g_gp.antialiasing(false);cout << "---------------" << endl;nmsp1::sound& g_snd = nmsp1::sound::getInstance();g_snd.setvolume(80);g_snd.envirsound(true);g_snd.bgsound(false);cout << "---------------" << endl;nmsp1::chatvoice& g_cv = nmsp1::chatvoice::getInstance();g_cv.chatvolume(70);g_cv.micsens(65);std::cout << "主线程执行完毕\n";
}

二:引入外观(facade)模式

graphic、sound、chatvoice——业务类 conffacade


客户端代码直接调用业务类代码使代码编写的复杂度上升


隔在客户端代码和业务类之间的采用外观模式实现的类

外观模式强调的是一种程序设计思想

//#include <boost/type_index.hpp>
using namespace std;
//#pragma warning(disable : 4996) namespace nmsp1
{//图形相关类class graphic{//-------------单件类实现相关begin--------------private:graphic() {};graphic(const graphic& tmpobj);graphic& operator=(const graphic& tmpobj);~graphic() {};public:static graphic& getInstance(){static graphic instance;return instance;}//-------------单件类实现相关end--------------public:void display(bool enable)  //是否全屏显示(true:是){cout << "图形->是否全屏显示->" << enable << endl;//其他代码略......}void effect(bool enable)  //是否开启特效(true:是){cout << "图形->是否开启特效->" << enable << endl;}void resolution(int index)  //设置窗口分辨率{cout << "图形->分辨率设置选项->" << index << endl;}void antialiasing(bool enable)  //是否开启抗锯齿(true:是){cout << "图形->是否开启抗锯齿->" << enable << endl;}//....其他接口略};//声音相关类class sound{//-------------单件类实现相关begin--------------private:sound() {};sound(const sound& tmpobj);sound& operator=(const sound& tmpobj);~sound() {};public:static sound& getInstance(){static sound instance;return instance;}//-------------单件类实现相关end--------------public:void bgsound(bool enable)  //是否开启背景声音(true:是){cout << "声音->是否开启背景声音->" << enable << endl;}void envirsound(bool enable)  //是否开启环境音效(true:是){cout << "声音->是否开启环境音效->" << enable << endl;}void expsound(bool enable)  //是否开启表情声音(true:是){cout << "声音->是否开启表情声音->" << enable << endl;}void setvolume(int level)  //音量大小设置(0-100){cout << "声音->音量大小为->" << level << endl;}//......其他接口略};//语音聊天相关类class chatvoice{//-------------单件类实现相关begin--------------private:chatvoice() {};chatvoice(const chatvoice& tmpobj);chatvoice& operator=(const chatvoice& tmpobj);~chatvoice() {};public:static chatvoice& getInstance(){static chatvoice instance;return instance;}//-------------单件类实现相关end--------------public:void micvolume(int level)  //麦克风音量大小设置(0-100){cout << "语音聊天->麦克风音量大小为->" << level << endl;}void micsens(int level)  //麦克风灵敏度设置(0-100){cout << "语音聊天->麦克风灵敏度为->" << level << endl;}void chatvolume(int level)  //聊天音量设置(0-100){cout << "语音聊天->聊天音量为->" << level << endl;}//......其他接口略};//扮演外观模式角色的类class conffacade{//-------------单件类实现相关begin--------------private:conffacade() {};conffacade(const conffacade& tmpobj);conffacade& operator=(const conffacade& tmpobj);~conffacade() {};public:static conffacade& getInstance(){static conffacade instance;return instance;}//-------------单件类实现相关end--------------public:void LowConfComputer()  //对于低配置电脑,只开启一些低配置选项{graphic& g_gp = graphic::getInstance();g_gp.display(true);  //全屏耗费资源更低g_gp.effect(false);g_gp.resolution(2);g_gp.antialiasing(false);sound& g_snd = sound::getInstance();g_snd.bgsound(false);g_snd.envirsound(false);g_snd.expsound(false);g_snd.setvolume(15);chatvoice& g_cv = chatvoice::getInstance();g_cv.micvolume(20);g_cv.micsens(50);g_cv.chatvolume(60);}void HighConfComputer()  //对于高配置电脑,能达到最好效果的项全部开启{graphic& g_gp = graphic::getInstance();g_gp.display(false);g_gp.effect(true);g_gp.resolution(0);g_gp.antialiasing(true);sound& g_snd = sound::getInstance();g_snd.bgsound(true);g_snd.envirsound(true);g_snd.expsound(true);g_snd.setvolume(50);chatvoice& g_cv = chatvoice::getInstance();g_cv.micvolume(100);g_cv.micsens(100);g_cv.chatvolume(100);}};
}int main()
{_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口nmsp1::conffacade& g_cffde = nmsp1::conffacade::getInstance();cout << "低配置电脑,调用LowConfComputer接口" << endl;g_cffde.LowConfComputer();cout << "---------------------------" << endl;cout << "高配置电脑,调用HighConfComputer接口" << endl;g_cffde.HighConfComputer();std::cout << "主线程执行完毕\n";
}

外观模式体现了面向对象程序设计的一个原则——迪米特法则(Law of Demeter,简称LoD)。得墨忒耳法则或者最小知识原则(Least Knowledge Principle,简称LKP):一个对象应该对其他对象尽可能少的了解,从而降低各个对象之间的耦合,提高系统可维护性。

外观模式包含两种角色
<1>Facade(外观角色):conffacade
<2>Subsystem(子系统角色):graphic、sound、chatvoice——业务类

外观设计模式的定义(实现意图):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

外观模式为客户端和子系统之间提供了一种简化的交互渠道但是并没有为子系统增加新的行为。如果希望增加新行为,应该通过修改子系统角色来实现。

三:另一个外观模式的范例

家庭影院外观模式类:HomeTheaterFacade,电器设备关联。
屏幕Screen;
灯光Light;
音箱Speaker;
DVD播放器DvdPlayer;
游戏机PlayerStation。

提供两个接口:
<1>看电影模式(WatchMovie):屏幕打开,灯光熄灭,音箱打开,DVD播放器打开,游戏机关闭。
<2>玩游戏模式(PlayGame):屏幕打开,灯光打开,音箱打开,DVD播放器关闭,游戏机打开。


家庭影院外观模式结构图

namespace nmsp2
{//屏幕class Screen{public:void On(){cout << "屏幕打开了!" << endl;}void Off(){cout << "屏幕关闭了!" << endl;}};//灯光class Light{public:void On(){cout << "灯光打开了!" << endl;}void Off(){cout << "灯光关闭了!" << endl;}};//音箱class Speaker{public:void On(){cout << "音箱打开了!" << endl;}void Off(){cout << "音箱关闭了!" << endl;}};//DVD播放器class DvdPlayer{public:void On(){cout << "DVD播放器打开了!" << endl;}void Off(){cout << "DVD播放器关闭了!" << endl;}};//游戏机class PlayerStation{public:void On(){cout << "游戏机打开了!" << endl;}void Off(){cout << "游戏机关闭了!" << endl;}};//-----------------------//家庭影院外观模式类class HomeTheaterFacade{public:void WatchMovie()  //看电影{//屏幕打开,灯光熄灭,音箱打开,DVD播放器打开,游戏机关闭scnobj.On();lgobj.Off();spkobj.On();dpobj.On();psobj.Off();}void PlayGame()  //玩游戏{//屏幕打开,灯光打开,音箱打开,DVD播放器关闭,游戏机打开scnobj.On();lgobj.On();spkobj.On();dpobj.Off();psobj.On();}private:Screen scnobj;Light lgobj;Speaker spkobj;DvdPlayer dpobj;PlayerStation psobj;};
}int main()
{_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口nmsp2::HomeTheaterFacade htfacobj;cout << "------开始看电影------" << endl;htfacobj.WatchMovie();cout << "---------------------------" << endl;cout << "------开始玩游戏------" << endl;htfacobj.PlayGame();std::cout << "主线程执行完毕\n";
}

08 外观(Facade)模式相关推荐

  1. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  2. 外观(Facade)模式

    文章目录 外观(Facade)模式 1. 意图 2. 别名 3. 动机 4. 适用性 5. 结构 6. 参与者 7. 协作 8. 效果 9. 实现 10. 代码示例 11. 已知应用 12. 相关模式 ...

  3. 设计模式之九 --- 外观(Facade)模式

    [1]基本概念 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. [2]简单分析 我们先来看下该设计模式的UML结构图: ...

  4. 浅学设计模式之外观Facade模式

    外观模式是软件工程中常用的一种软件设计模式.它为子系统中的一组接口提供一个统一的高层接口.使用子系统更容易使用. 下图是状态模式的UML图. 结构 Facade 这个外观类为子系统中Packages ...

  5. C++设计模式之Facade模式(外观模式)

    Facade模式(外观模式),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象, ...

  6. Facade (外观)模式

    15.1 Facade 模式   程序总是会变得越来越大.随着时间的推移,程序中的类会越来越多,而且它们之间相互关联,这会导致程序结构也会变得越来越复杂.我们在使用这些类之前,必须先弄清楚它们之间的关 ...

  7. Facade模式——设计模式学习笔记

    Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...

  8. C++设计模式-Facade模式

    Facade模式 作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一 ...

  9. Facade模式的介绍

    Facade模式http://www.diybl.com/ 2007-12-22 网络 点击:157 [ 评论 ] - - 文章搜索:     [点击打包该文章]  [本站开通在线QQ讨论群] 第一次 ...

  10. Java设计模式 -11- 外观模式(Facade模式)

    Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...

最新文章

  1. 实现分布式服务注册及简易的netty聊天
  2. 升级WordPress时提示”另一更新正在进行”
  3. [Qt教程] 第21篇 数据库(一)Qt数据库应用简介
  4. 程序员外包避坑指南?
  5. 思科CCNA第一学期期末考试答案
  6. 安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法
  7. JAVA定时器ScheduledExecutorService中,scheduleAtFixedRate和scheduleWithFixedDelay的区别
  8. 关于Django的搭建
  9. LaTeX tikz初探——空间矢量旋转示意图,四元数(4)
  10. transient、Externalizable
  11. Perl5中19个最重要的文件系统工具
  12. Kafka 几个实现细节
  13. python表白程序-python告白程序
  14. colunm-count, orphans,widows
  15. [SRv6]《SRv6网络编程》SRv6 OAM与随路网络测量(2/2:IFIT)
  16. 使用PySide2创建图形化Python程序时:Available platform plugins are: direct2d, minimal, offscreen, windows
  17. [excel]收藏夹-遇过问题的解决方法总览
  18. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
  19. GMap2 与 google.maps.Map 的区别
  20. Kettle邮件发送

热门文章

  1. 2-25 MySQL基础
  2. 使用Golang语言的分金币作业 你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaro
  3. Fuzzing测试你懂吗?
  4. termux怎么生成木马_termux不用root将里面的文件导出,同时也可以导入!
  5. Acknowledgements致谢词
  6. DS1307的设置问题和经验
  7. 卧听夏蝉---如何在论文中优雅的插入代码
  8. 化工厂人员定位解决方案,智能化工厂定位系统无所不在-新导智能
  9. 摄影技术学习笔记(持续学习)
  10. 【装机】双十一DIY装机5k配置推荐(附PC版CPU,GPU天梯图)