设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
在此先容我拿“小弟”这个词来扯一下淡。什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”。在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客中介绍“外观模式”(Facade Pattern)。其实外观模式与之前我们介绍过的“命令模式”有些相似之处,都是对方法的封装。但两者有着明显的不同,命令模式是对同一个对象中的不同方法进行封装,而外观模式是对多个对象中的多个方法进行封装。当然在实现时我们要循序“依赖接口而不依赖具体实现”的原则。更确切的说“外观模式”是对多个接口进行整合,以简化用户调用的方式。下方是外观模式的定义:
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
定义一般都是不太好理解的,那么接下来让我们通俗易懂的来解释一下外观模式。比如你做一件事情需要三步,你必须挨个的去执行。如果你使用外观模式进行简化后,你只需要执行外观模式中的一步即可,因为这一步会包括你之前执行的三步。当然“外观模式”并不是对你之前要执行的三步的东西进行封装,使用“外观模式”后你仍然可以亲自的去执行之前的那三步。
接下来我们将通过一个示例来认识一下“外观模式”,就以上面的工作三部曲为例。就以我为例吧,每天早晨上班,我都会做三件事情:第一,打开插排;第二,打开MacBook;第三步,打开外接显示器(当然如果你没有小弟就要自己去做这些事情了)。接下来我们将通过模拟这三件事情来学习一下我们的外观模式。下方先给出没有外观模式的类图与代码实现,然后在此基础上给出使用“外观模式”的类图与代码实现。
一、没有小弟(无“外观模式”)的情况下的类图与代码实现
如果你没有小弟,那么你就得事必躬亲了。该部分我们将会把上面的“工作三部曲”用代码去实现,当然在实现是依然是我们之前的风格。下方我们会先给出类图,然后在给出代码实现,最后给出测试用例。测试用例就是用户对插排、MacBook Pro、显示器进行相应的操作。当然下班时也要做一些相应的操作,下班所做的操作与上班所做的操作正好相反,在下方的测试用例中我们也给出了相应的实现。废话少说,开始我们的实现。
1、无“小弟”的类图(无外观模式)
下方的截图是没有使用外观模式的类图。在下方类图中有三个协议(接口),分别是SocketType(插排协议)、ComputerType(计算机协议)和DisplayDeviceType(显示器设备协议)。OXSocket(公牛插座)、MacBookPro和SamsungDisplay(三星的显示器)又分别实现了这些协议。Client客户端(也就是我了)依赖于这三种物品的接口而不依赖于具体实现。也就是说我打开的只要是插排就行,至于什么品牌我不关心,只要符合要求即可。

2、代码实现
有了上面的类图我们给出代码实现就不成问题了,因为测试用例就是我们的Client,在此我们就不详细的给出Client类了。关于Client类中的内容请参见下方的测试用例。下方黄框中的是我们插排接口与公牛插座的具体代码,其中on()是打开,off()是关闭。下方的绿框中是我们笔记本接口与MacBook Pro的代码实现,startUp()是启动,shutdown()是关闭。最后一个红框中的代码是显示器接口与三星显示器的代码实现,其中on()是打开,off()是关闭。具体代码如下所示:

3.测试用例
在没用外观模式的情况下,我们的Client仍然可以逐一的使用上述代码。测试用例就是我们Client中的代码,因为我们是在Playground中进行测试的,再次就不在创建Client类了,下方的代码就是Client中的代码。在下方的代码段中,我们先创建了我们需要的对象(公牛插座、MacBook Por以及三星的显示屏)。紧接着是上班要做的三件事情(开插座、启动计算机、打开外接显示器),然后给出了下班要做的事情(关外接显示器、关闭计算机、关插座)。具体代码如下所示:

下方截图就是上述测试用例输出的结果,至此我们没有使用“外观模式”的代码就实现完毕。

二、你收了个小弟(添加“外观模式”)
现在你收了个小弟,接下来该你“小弟”出场了。在上面的测试用例中,也就是我们Client调用上述对象做一些事情时我们会发现过程有些繁琐,能不能简化一下上述操作呢。也就是说用户只需要只需一步就可以将插座、笔记本、外接显示器给打开呢?当然可以,举个例子,假如你是公司比较NX的人物,又假如你下边有好多小弟,上面这些东西就可以完全交个你的小弟去做。比如你说我要工作了,然后你的小弟就会帮你打开插座,启动MacBookPro,打开显示器。如果你说我要下班了,然后你这个小弟呀,又屁颠屁颠的把显示器关掉,将笔记本和插排关掉。
我们来对比一下,没有“小弟”之前你上下班得做六件事情。但是如果你有了“小弟”的话,你上下班就需要两件事情,就是告诉你的“小弟”你何时下班何时上班。这个“小弟”在此扮演的角色就是“外观模式”。言归正传,“外观模式”就如同小弟一样可以简化你的操作,接下来我们就在上一部分的基础上添加一个“外观”类(也就是我们的小弟了),将上面我们那些琐碎的工作交给我们的“小弟”去做。
1、带有“小弟”的类图
我们将上述没有“小弟”的类图添加上“小弟”,也就是添加删“外观模式”所需要的外观类。下方这个截图中就是带有“小弟”的类图,上面的那个红框中的EveryDayWorking就是我们的“小弟”类,也就是外观模式所需要的“外观”类。其中定义了上述我们没有“小弟”时要做的事情。EveryDayWorking依赖于插排接口、计算机接口和显示器接口。我们的Client就可以使用这个外观类EveryDayWorking做我们之前做的事情。简化了Client的一些操作。如下所示:

2、“小弟”的具体代码实现
有上面的类图可知,我们没有修改之前的任何代码,只是在原来的基础上添加了一个EveryDayWorking类。所以在代码实现时我们只需要添加上这个类即可,下方代码片段就是EveryDayWorking类的具体实现。在下方代码片段中的startWorking()方法就是我们之前上班时要亲自做的三件事情,而endWorking()就是我们下班时要做的事情。现在我们都交给了我们的小弟去做,具体如下所示:

3、给“小弟”派工作
给“小弟”派工作,其实就是我们的测试用例。我们添加完EveryDayWorking类后,我们就可以委托EveryDayWorking来做之前那些琐碎的事情了。下方就是Client调用“小弟”的代码。下方的测试用例和上一部分的测试用例相比简单了许多,这就是“外观模式”的优点,可以简化操作,并且可以将你与你的琐事之间进行解耦。下方就是我们引入“外观模式”后的测试用例与该测试用例的输出结果。当然,此时此刻拥有小弟的你仍然可以事必躬亲,仍然可以自己去做之前的事情呢,小弟只是帮你简化你的操作,至于你使用还是不使用他就在那。

至此我们的“外观模式”就介绍完了,用大白话说,“外观模式”就是你的“小弟”,扯淡点将,你可以将外观模式看做是你的“小弟模式”,它可以简化接口的调用。本篇博客中的代码实例仍然会在Github上进行分享。
github分享地址:https://github.com/lizelu/DesignPatterns-Swift
设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 七个结构模式之外观模式(Facade Pattern)
定义: 为子系统的一组接口提供一个统一的入口,从而降低系统之间的耦合度,提高子系统的可用性.外观模式又称为门面模式,是迪米特法则的一个体现,主要目的就是降低耦合. 结构图 Facade:抽象外观类,子 ...
- C#设计模式——外观模式(Facade Pattern)
一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...
- 研磨设计模式解析及python代码实现——(二)外观模式(Facade)
一.外观模式定义 为子系统中的一组接口提供一个一致的界面,使得此子系统更加容易使用. 二.书中python代码实现 class AModuleApi: def testA(self): pass cl ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 【UE4 设计模式】外观模式 Facade Pattern
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- Gradle配置APK自动签名完整流程
转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...