Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

适用于:

为子系统中统一一套接口,让子系统更加容易使用。

 1 #include <iostream>
 2 using namespace std;
 3
 4 class SubSystemA
 5 {
 6 public:
 7     void doThing()
 8     {
 9         cout << "SubSystemA run" << endl;
10     }
11 };
12
13 class SubSystemB
14 {
15 public:
16     void doThing()
17     {
18         cout << "SubSystemB run" << endl;
19     }
20 };
21
22 class SubSystemC
23 {
24 public:
25     void doThing()
26     {
27         cout << "SubSystemC run" << endl;
28     }
29 };
30
31
32 class Facade
33 {
34 public:
35     Facade()
36     {
37         sysA = new SubSystemA;
38         sysB = new SubSystemB;
39         sysC = new SubSystemC;
40     }
41     ~Facade()
42     {
43         delete sysA;
44         delete sysB;
45         delete sysC;
46     }
47 public:
48     void doThing()
49     {
50         sysA->doThing();
51         sysB->doThing();
52         sysC->doThing();
53     }
54 protected:
55 private:
56     SubSystemA *sysA;
57     SubSystemB *sysB;
58     SubSystemC *sysC;
59 };
60 //普通方法
61 void main1801()
62 {
63     SubSystemA *sysA = new SubSystemA;
64     SubSystemB *sysB = new SubSystemB;
65     SubSystemC *sysC = new SubSystemC;
66
67     sysA->doThing();
68     sysB->doThing();
69     sysC->doThing();
70     delete sysA;
71     delete sysB;
72     delete sysC;
73
74     return ;
75 }
76 //外观模式
77 void main1802()
78 {
79     Facade *f = new Facade;
80     f->doThing();
81     delete f;
82
83 }
84
85 void main()
86 {
87     //main1801();
88     main1802();
89     system("pause");
90 }

要点

1.Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

2.Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。

3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

4. 在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个外观类,而仅仅是说对每一个子系统只有一个外观类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个外观类,整个系统可以有数个外观类。

5. 外观模式的用意是为子系统提供一个集中化和简化的沟通管道,而不建议向子系统加入新的行为。

6. 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。

适用性和优缺点

适用性

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

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

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

优点

1. 松散耦合
    外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。即要点2.

2.  简单易用
    外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观交互就可以了,相当于外观类为外部客户端使用子系统提供了一站式服务。

3. 更好的划分访问层次
     通过合理使用Facade,可以帮助我们更好的划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观中,这样既方便客户端使用,也很好的隐藏了内部的细节。

缺点

过多的或者是不太合理的Facade也容易让人迷惑,到底是调用Facade好呢,还是直接调用模块好。

转载于:https://www.cnblogs.com/D-DZDD/p/7341953.html

11,外观模式(Facade Pattern)是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。...相关推荐

  1. 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用

    文章目录 Pre 定义 案例 Demo V1.0 Boss直接管理 V2.0 引入外观类 PmManagerFacade 何时使用Facade Tomcat Mybatis Pre 我们先来回顾下门面 ...

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

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

  3. 设计模式(八): 从“小弟”中来类比外观模式(Facade Pattern)

    在此先容我拿"小弟"这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿"小弟"来类比"外观模式".在上面一篇 ...

  4. 使用C#实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  5. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  6. 【设计模式自习室】门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  7. 设计模式 -结构型模式_ 装饰者模式Decorator Pattern 在开源软件中的应用

    文章目录 定义 结构图 需求 装饰者模式 装饰者模式在MyBatis中的应用 小结 定义 装饰模式 Decorator : 在不改变原有功能的基础上, 动态的给一个对象添加一些额外的职责 ,非常符合开 ...

  8. 代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理

    一.问题描述 当我们在网络上加载一些图像时,限于连接宽带和网络负载,下载可能需要一些时间,所以在等待图像加载的时候,就应该显示一些东西.我们也不希望在等待图像时,整个应用程序被挂起.一旦图像加载完成, ...

  9. Java设计模式——外观模式【Facade Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

最新文章

  1. vim 打开中文乱码
  2. FastJson解析对象及对象数组--项目经验
  3. 2015 年,我和华大基因立下一个小目标……
  4. Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流
  5. java 22 - 8 多线程之线程生命周期图解
  6. vue-cli 3.0安装和使用
  7. AtCoder Beginner Contest 183 总结
  8. 301 重定向 怎么让输入的不带www自动加上www
  9. Linux多线程编程
  10. LabelImg使用方法
  11. Chrome浏览器安装IE_Tab
  12. php 会议室预定系统,MRBS开源会议室预订系统安装
  13. 解决3Dmax材质编辑器重影问题
  14. 想要职场安全感?那就请你别停止成长
  15. 权限认证实现(责任链模式)
  16. 你们要的网页版matlab来了,速领!
  17. 编译原理 实验2 语法分析器的构造
  18. 网页图片无缝循环滚动html代码
  19. 计算机网络——网络层之移动IP
  20. FFmpeg拉取rtmp流转udp输出播放

热门文章

  1. 关于JavaWeb项目加密的实现 2021-04-24
  2. python123程序设计实验答案_Python程序设计第二次实验报告
  3. 文言文生成器_英语不好,学编程太困难?或许用文言文来编程你就更加容易上手了!...
  4. mysql高效索引覆盖索引_MySQL高效索引:覆盖索引
  5. java 字符转换为数字_JAVA中使用字符串转换为数字
  6. 用javascript来完成显示和隐藏的案例
  7. linux ftp远程更新,用ftp远程安装linux
  8. 天涯明月刀怎么导入php捏脸数据,天涯明月刀捏脸数据怎么导入 天涯明月刀捏脸数据在哪...
  9. android源码使用方法,android源码中使用到的设计模式(创建型)
  10. js 禁止android手机返回键,js禁止浏览器,微信,及手机物理键的返回