外观模式(Facade)介绍

外观模式也叫门面模式

外观模式就是提供一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易使用。如下图,是使用外观模式后将子系统的使用变得更加简单。

说起来比较复杂,实际上在日常生活中经常能遇到。比如部门安排出差,需要去淘宝买出差洗漱用品,一共有4中东西要选择。洗面奶,牙膏,洗发水,润肤露。消费者可以自己一个买,也可以买套餐。把上图大方框外的小方块看成不同的消费者,里面的小方块看成洗面奶之类。Façade就是店家提供的不同套餐选择的那个接口。

外观模式实现

内部原始接口

#define BIG_BOTTLE 0#define MID_BOTTLE 1#define SMALL_BOTTLE 2char *toiletries_type[] ={"big bottle","middle bottle""small bottle"};void buy_face_soap(int type){printf("buy %s face soap\n", toiletries_type[type]);}void buy_shampoo(int type){printf("buy %s shampoo\n", toiletries_type[type]);}void buy_toothpaste(int type){printf("buy %s toothpaste\n", toiletries_type[type]);}void buy_bodylotion(int type){printf("buy %s body wash\n", toiletries_type[type]);}

原始函数样例

在普通模式里,外部client可以随意调用内部的接口。

void client_buy_normal(){buy_face_soap(MID_BOTTLE);buy_face_soap(MID_BOTTLE);buy_shampoo(BIG_BOTTLE);buy_shampoo(MID_BOTTLE);buy_toothpaste(SMALL_BOTTLE);buy_toothpaste(MID_BOTTLE);buy_bodylotion(BIG_BOTTLE);}

外观模式函数样例

实现了两个封装好的接口pack_for_woman和pack_for_man。不允许外部client调用内部接口,只允许调用封装好的facade接口pack_for_woman和pack_for_man。

void pack_for_woman(){buy_face_soap(MID_BOTTLE);buy_shampoo(BIG_BOTTLE);buy_toothpaste(SMALL_BOTTLE);buy_bodylotion(BIG_BOTTLE);}void pack_for_man(){buy_face_soap(MID_BOTTLE);buy_shampoo(MID_BOTTLE);buy_toothpaste(MID_BOTTLE);}void client_buy_with_facade(){pack_for_woman();pack_for_man();}

在原始函数和外观模式实现里,买的东西都一样。

模式实现总结

引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系。但是,灵活性变差了,客户不能自由选择子系统内部的接口,只能使用封装好的一套接口。

实际生活里,客户并不是需要选子系统内部接口。比如DIY电脑就相当于普通的模式,消费者会买cpu,主板等各个组件。而品牌PC就类似于门面模式,只能购买特定个型号。对于手机就更不用说了,没有消费者能买soc,flash来装手机。

来源:华为云社区  作者:lurayvis

设计模式的C语言应用-外观模式-第八章相关推荐

  1. Java设计模式之结构型:外观模式

    一.什么是外观模式: 外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口.使用外观模式有以下几点好处: (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要 ...

  2. Android源码设计模式探索与实战【外观模式】

    IT行业,一直讲一句话,拼到最后都拼的是"内功",而内功往往就是指我们处理问题的思路.经验.想法,而对于开发者来说,甚至对于产品也一样,都离不开一个"宝典",就 ...

  3. python设计模式(九):外观模式

    # -*- coding:utf-8 -*- class API1: def Save(self):print('保存数据A') def Del(self):print('删除数据A') class ...

  4. HeadFirst设计模式_读书笔记_007_外观模式

    外观模式:提供了一个统一的接口,用来访问子系统中的一群接口或者一个很大的接口,总之外观模式的目的是简化并统一其他的接口.与适配器不同的是,它不会修改其他的接口,只是将客户从一个复杂的子系统中解耦出来. ...

  5. 设计模式的C语言应用-命令模式-第五章

    模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...

  6. 设计模式的C语言应用-访问者模式-第九章

    访问者模式(Visitor)介绍 把对象数据和操作分离,使操作可以独立演化.一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变.访问者模式是适用于那些数据结构比较稳定的模式.这个算是在C里面 ...

  7. 设计模式的C语言应用-建造者模式-第七章

    模式介绍 建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰.它隔离了复杂产品 对象的创建和使用,使得相同的创建过程能够创建不同的产品.若几个 产品之间存在较大的差异,则不适用 ...

  8. 设计模式的C语言应用-状态机模式-第二章

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  9. 设计模式的C语言应用-导言-第一章

    [摘要] 软件编写模式是开发过程中的重要经验总结.灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护. 设计模式最开始是针对面向对象语言提出的.经典的书如<设计模 ...

最新文章

  1. 非监督异常点检测算法总结——没有想到矩阵分解和编码解码器也是一种思路...
  2. 【CSS 伪类】顺序
  3. CDOJ 486 Good Morning 傻逼题
  4. 前端JavaScript基础知识点
  5. 朴素贝叶斯算法-分类算法
  6. php设置html全局路径_PHPCMS V9 URL去掉或修改/html路径的方法
  7. mysql修改数据存放位置_Mysql 修改数据库存放位置
  8. 电脑无法读取移动硬盘_移动硬盘U盘提示:文件或目录损坏且无法读取如何解决?...
  9. 为计算机构建安全方案,计算机科学系安全管理标准化建设实施方案
  10. Dell’Oro 5年期数据中心报告预测25G/100G端口速率市场快速上升
  11. SQL语句BETWEEN
  12. multisim 10 小知识
  13. mysql data目录 恢复_利用mysql data文件夹恢复数据
  14. 计算机管理内存条,win10系统查看电脑内存条型号的方法
  15. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解 道翰天琼认知智能api机器人接口1。
  16. Jenkins基础:获取Jenkins-Crumb的错误信息与对应方法
  17. 前后端传输加密代码-java
  18. 《孩子,为你自己读书》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+多多图书馆+志存当高远+读万卷书如行万里路+术业有专攻+读书是对思想的一种升华+立钻哥哥++==)
  19. 三年java现在还是菜的不行_你java开发几年还是那么菜是因为你没有做到这些
  20. 组态王与西门子1200通信,读取温湿度数据

热门文章

  1. 两个运放制作加法器_集成电路的分类及其制作工艺
  2. oracle中rac是什么意思,oracle rac是什么?
  3. python一加到二十等于多少_Python 3.1新变化之性能改善篇(转载)
  4. Django使用本机IP无法访问,使用127.0.0.1能正常访问
  5. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
  6. 1.11 UML 类图(多看多用就熟悉了)(节选自:《大话设计模式》)
  7. labelImg 工具
  8. 10 个实验性的 JS/CSS3 编程技术
  9. 数据 3 分钟 | TiDB 5.0 正式发布、Graph + AI 2021 全球峰会即将召开、2020 年图灵奖公布...
  10. 中秋快乐:数据库的全家福喜添新员