二十、外观模式(Facade Pattern)

1. 何为外观模式

外观模式是对多个对象中的多个方法进行封装,外观模式是对多个接口进行整合,以简化用户调用的方式。

外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

定义一般都不太好理解,接下来我用一种通俗易懂的方式解释一下外观模式。比如你要做三件事,你必须挨个的去执行。如果你使用外观模式进行简化后,你只需要执行外观模式中的一步即可,因为这一步会包括你之前执行的三步。当然“外观模式”并不是对之前要执行的三步的东西的封装,使用外观模式后你仍然可以亲自去执行之前的那三步。

2. 情景设置

接下来我们将通过一个示例来认识一下外观模式,这里就以我工作为例子吧。每天早晨上班,我都会做三件事:第一步,打开插排;第二步,打开MacBook;第三步:打开外接显示器。对于这个过程,每件事都要事必躬亲,下面给出没有使用外观模式的类图,如图2-1所示:

图2-1

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

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

至此我们没有使用“外观模式”的代码就实现完毕。

通过以上代码我们发现Client调用上述对象做一些事情时又些繁琐,能不能简化一下上述操作呢?也就是说我只需要一步就可以将插座、笔记本、外接显示器打开呢?当然可以,举个例子,假如你是公司比较NX的人物,下边有好多小弟,上面这些活完全可以交给你的小弟去做。比如你说我要工作了,然后你的小弟就会帮你打开插座,启动MacBookPro,打开显示器。如果你说我要下班了,然后你这个小弟呀,又屁颠屁颠的把显示器关掉,将笔记本和插排关掉。

我们来对比一下,没有“小弟”之前你上下班得做六件事情。但是如果你有了“小弟”的话,你上下班就需要两件事情,就是告诉你的“小弟”你何时下班何时上班。这个“小弟”在此扮演的角色就是“外观模式”。言归正传,“外观模式”就如同小弟一样可以简化你的操作,接下来我们就在上一部分的基础上添加一个“外观”类(也就是我们的小弟了),将上面我们那些琐碎的工作交给我们的“小弟”去做。

3. 代码实现

我们将上述没有“小弟”的类图添加上“小弟”,也就是添加删“外观模式”所需要的外观类。下方这个截图中就是带有“小弟”的类图,上面的那个红框中的EveryDayWorking就是我们的“小弟”类,也就是外观模式所需要的“外观”类。其中定义了上述我们没有“小弟”时要做的事情。EveryDayWorking依赖于插排接口、计算机接口和显示器接口。我们的Client就可以使用这个外观类EveryDayWorking做我们之前做的事情。简化了Client的一些操作。如图3-1所示:

图3-1

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

// 将上面的内容使用外观模式进行简化
class EveryDayWorking {
    private var socket: SocketType = OXSocket()
    private var cumputer: ComputerType = MacBookPro()
    private var display: DisplayDeviceType = SamsungDisplay()
    
    func setSocket(socket: SocketType) {
        self.socket = socket
    }
    
    func setCumputer(cumputer: ComputerType) {
        self.cumputer = cumputer
    }
    
    func setDisplay(display: DisplayDeviceType) {
        self.display = display
    }
    
    func startWorking() {
        print("开始工作:")
        socket.on()
        cumputer.startUp()
        display.on()
    }
    
    func endWorking() {
        print("结束工作:")
        display.off()
        cumputer.shutdown()
        socket.off()
    }
}



let everyDayWorking = EveryDayWorking()
everyDayWorking.startWorking()
print("\n")
everyDayWorking.endWorking()

通过上面的演示,我们可以发现,外观模式的优点就是可以简化操作,并且可以将你与你的琐事之间进行解耦。

用大白话讲,你可以将外观模式看作是你的“小弟模式”,它可以简化接口的调用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 1 场景问题# 1.1 生活中的示例## 外观模式在现实生活中的示例很多,比如:组装电脑,通常会有两种方案。 一个...
    七寸知架构阅读 6,194评论 7 57
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,479评论 25 707
  • 佛说: 苦海无边 、回头是岸 试问 这世间的人哪一个人没有躺过苦海 才幡然醒悟 又道 浮华世界 万里皆是苍山 那么...
    上官楠阅读 232评论 2 4
  • 历经了十八个春夏秋冬,也尝了数不尽的人间冷暖,曾经的经历让我也明白许多人情世故,如今的我们不断抱怨着自己的工作、...
    lucky寒阅读 261评论 0 0