一. 举例说明

还以我以前做的文件系统(FileSys)为例:

文件系统是一个独立的系统,它提供一套核心的文件操作。

除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统(ZipFile),加密子系统(EncrypeFile)和刻录子系统(BurnCD),这四个子系统相互独立,但又可以做为主系统功能的一部分。

假设客户需要我这个文件系统有两种执行模式,一种是完全模式,一种是简单模式。

完全模式,要求杀毒子,压缩,加密和刻录功能都有。
简单模式,要求只要有杀毒,刻录就行了。

第一种设计:

文件系统自己管理所有的子系统,并实现客户的需求。

最开始的话,我们是按上面的结构来设计的,这个文件系统(FileSys)就要自己管理和组织上面的四个子系统。问题是子系统变化比较多,特别是重
构之后,接口也变了,这时也要相应的修改这个文件系统。最麻烦的是,有时一个子系统要分离出好多小类,这对子系统是好事,但是对FileSys来说,调用
越来越复杂和困难了。

这种设计的问题是:文件系统和子系统耦合性太高了!

第二种设计:

后来我们独立出一个中间层,由中间层来统一管理这些子系统,并对外提供相对简单的接口,使它们之间减少依赖。


代码实现:

  1. //杀毒
  2. class KillVirus
  3. {
  4. public:
  5. void Operation1() { cout<<"杀毒"<<endl; }
  6. };
  7. //压缩
  8. class ZipFile
  9. {
  10. public:
  11. void Operation2() { cout<<"压缩"<<endl; }
  12. };
  13. //加密
  14. class EncryptFile
  15. {
  16. public:
  17. void Operation3() { cout<<"加密"<<endl; }
  18. };
  19. //刻录
  20. class BurnCD
  21. {
  22. public:
  23. void Operation4() { cout<<"刻录"<<endl;}
  24. };
  25. //高层接口
  26. class OperatorWapper
  27. {
  28. public:
  29. //完全功能
  30. void MethodA()
  31. {
  32. KillVirus kill;
  33. ZipFile zip;
  34. EncryptFile encrypt;
  35. BurnCD burn;
  36. kill.Operation1();
  37. zip.Operation2();
  38. encrypt.Operation3();
  39. burn.Operation4();
  40. }
  41. //简单功能
  42. void MethodB()
  43. {
  44. KillVirus kill;
  45. BurnCD burn;
  46. kill.Operation1();
  47. burn.Operation4();
  48. }
  49. };
  50. //测试代码
  51. int main()
  52. {
  53. OperatorWapper op;
  54. op.MethodA();//完全功能
  55. op.MethodB();//简单功能
  56. return 0;
  57. }

二. 外观模式

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

简单的说,就是分层的概念

说明:

1. 在设计初期,应该有意识的将不同层分离,比如常用的三层架构,就是考虑在数据访问层,业务逻辑层与表示层之间,建立Facade,使复杂的子系统提供一个简单的接口,降低耦合性。

2. 在开发阶段,子系统往往因为不断的重构而变的越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

3. 在维护阶段,可能这个系统已经非常难以维护和扩展了,此时你可以为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

设计模式C++描述----14.外观(Facade)模式的更多相关文章

  1. 设计模式--外观(Facade)模式

    Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...

  2. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  3. 外观(Facade)模式

    外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需 ...

  4. 十一、外观(Facade)模式--结构模式(Structural Pattern)

    外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...

  5. 设计模式(十五)Facade模式

    Facade模式可以为相互关联在一起的错综复杂的类整理出高层接口,可以让系统对外只有一个简单的接口,而且还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正常的顺序调用各个类. 还是先看一下示例程 ...

  6. 《图解设计模式》读书笔记7-1 facade模式

    目录 1. Facade模式简介 2. 示例程序 2.1 类图 2.2 程序 3.角色和类图 4.思路拓展 1. Facade模式简介 开发程序的过程中,随着时间的推移,类会越来越多,调用关系会越来越 ...

  7. Head First 设计模式 —— 08. 外观 (Facade) 模式

    思考题 想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262 println.log 日志接口.JDBC 接口 突然让想感觉想不出来,各种 API 都用得挺 ...

  8. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  9. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

随机推荐

  1. SD-WAN 配置及应用模板**(二)

    目录 0. 前言 1. 配置模板 1.1 创建各类 'Feature' 模板: 1.1.1 添加波特率模板 1.1.2 添加 'VPN0' 模板 1.1.3 添加 'VPN10' 模板 1.1.4 添 ...

  2. git 查看分支

    1.查看本地分支 git branch 2.查看所有分支 git branch -a 2.查看所有分支及对应版本信息 git branch -va

  3. 阿里云服务器ecs配置之安装nginx

    一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...

  4. jquery 动态控制显隐

    1.第1种方法 ,给元素设置style属性 $("#hidediv").css("display", "block"); 2.第2种方法 , ...

  5. 从无到有,构建GIS + BIM大厦

    声明:本文是一个系列原创(作者在GIS+BIM行业已有从业15年有余,还是个行业的小学生,文章内容不免有错误或者不当之处,敬请理解),旨在通过这个系列打造一个高性能,高可扩展的GIS+BIM框架,抛砖 ...

  6. Java 学习笔记之 线程Yield

    线程Yield: yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片. public class Yie ...

  7. [TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法浅谈

    1.读 datasheet 在<DS_TLSR8267-E21_Datasheet for Telink BLE SoC TLSR8267.pdf>第11章详细介绍了ADC相关属性及参数. ...

  8. 编译安装msyql

    环境: ubuntu18.04.2 mysql5.7.21 #创建mysql属组 groupadd mysql useradd -g mysql mysql #查看属组 tail /etc/passw ...

  9. atomic_inc(&v)原子操作简述

    atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态. 原子操作 所谓原子操作,就是该 ...

  10. 转:python2.x 和 python3.x的区别

    注:本文的原文地址为Key differences between Python 2.7.x and Python 3.x 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习 ...