《Head.First设计模式》的学习笔记(9)--外观模式
意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构:
![]()
例子:
假设你有一套杀手级的家庭影院系统,内含DVD播放器、投影仪、自动屏幕、环绕立体声等。那么当你想看一部DVD时,需要做哪些事情呢(用最土的方式)?
1、将灯光调暗;
2、放下屏幕;
3、打开投影仪;
4、将投影仪的输入切换到DVD;
5、将投影仪设置成宽屏模式;
6、打开功放;
7、将功放的输入设置为DVD;
8、将功放设置为环绕立体声;
9、将功放音量调到中;
10、打开DVD播放器;
11、开始播放DVD。
我想如果每次看DVD时都要进行这样一番折腾,那我宁愿不看了。上面的操作暴露了哪些问题呢?
1、操作麻烦。具体体现在打开DVD、关闭DVD、改听CD或者广播。
2、升级麻烦(就是耦合度太大)。如果我要升级系统,那么我还必须重新学习另一套操作流程。
那么这些问题如何解决呢?
使用外观模式,新建一个门户类(或管理类),暴露出一些方法,在这些方法里对这些子系统进行调用(这里的子系统具体指灯光、屏幕、投影仪、功放、DVD等)。具体代码很简单,略。
外观模式的优点:
1、对接口进行了简化,方便客户使用。
2、可以实现客户与子系统解耦,易于维护。
缺点:
1、多了一个包装类,可能导致复杂度和开发时间的增加,并降低运行时的性能。
值得注意的地方:
1、外观模式对接口进行了简化,但这并不意味着对子系统进行彻底封装。如果有必要,这些子系统的接口还可以继续暴露给客户,这就是所谓的高级功能(或称为自定义)。
2、外观模式不能新增功能,但他可以将某些功能按次序执行。例如先打开DVD,后播放DVD。
3、子系统与外观不是一对一关系,是多对多关系。一个子系统可以拥有多个外观,一个外观可以调用多个子系统。
4、外观模式与适配器模式的区别不是包装的类的多少,而是意图不一样。适配器模式也可以包装很多类,但他的意图是改变接口,符合客户的期望;外观模式是将接口进行简化,方便使用。
《Head.First设计模式》的学习笔记(9)--外观模式的更多相关文章
- 《Head First 设计模式》学习笔记——适配器模式 + 外观模式
在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- .NET设计模式(12):外观模式(Façade Pattern)(转)
概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依 ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- Java 设计模式系列(十)外观模式
Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...
- 设计模式之第7章-外观模式(Java实现)
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
- 设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
- 设计模式学习系列9 外观模式Facade
1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
- 【设计模式】学习笔记17:代理模式之保护代理与Java反射
本文出自 http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...
- C++ 常用设计模式(学习笔记)
1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...
随机推荐
- cuda8.0 /usr/bin/ld: cannot find -lGL
/usr/bin/ld: cannot find -lGL collect2: ld returned 1 exit status tennycent@tennycent-desktop:~/$ ...
- 【第六篇】Volley之https相关
Volley之https信任所有证书实现: public class HttpsTrustManager implements X509TrustManager { private static Tr ...
- Distributing Parts
Distributing Parts 题目链接:http://codeforces.com/problemset/problem/496/E 贪心 将音乐和人都以低音升序排序,贪心处理低音更低的音乐, ...
- IIS7或IIS7.5 ISAPI和CGI限制找不到的问题记录
弄了一下午,才找到,选择最上面的节点,如下图,记录备用
- 数据库 Mysql内容补充一
mysql时间函数 --获取当前日期 select current_date(); --获取当前时间 select current_time(); --获取当前的日期和时间 select now(); ...
- 使用PhotoShop
详细请看:http://blog.sina.com.cn/s/blog_73dc36510101ahim.html
- [妙味DOM]第三课:Event-事件详解1
知识点总结 焦点事件 onfocus 获取焦点 onblur 失点焦点 obj.focus() 给指定元素设置焦点 obj.blur() 取消指定元素的焦点 obj.select() 选择指定元素里的 ...
- Linux中kettle自动化部署脚本
自己写的一个自动化在Linux中部署kettle的脚本,包括一些遇到的问题在脚本中都有涉及. kettle是官网最新版本pdi-ce-6.1.0.1-196.zip 目前最新版本下载地址:https: ...
- Openjudge-计算概论(A)-简单算术表达式求值
描述: 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运 ...
- if语句—交互程序二
参考:<笨方法学Python>—习题31 用了两个嵌套的if语句! # coding: utf-8 print u"欢迎来到玩家国度, 你需要根据提示完成闯关!" # ...