从零开始学习Java设计模式 | 结构型模式篇:外观模式

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学习Java设计模式 | 结构型模式篇:外观模式相关的知识,希望对你有一定的参考价值。

在本讲,我们来学习一下结构型模式里面的第五个设计模式,即外观模式。

概述

在向大家讲解外观模式之前,我们先来看一个例子。

有些人可能炒过股票,但其实大部分人都是不太懂里面的一些操作的,这种没有足够了解证券知识的情况下炒股票是很容易亏钱的,刚开始炒股时我们肯定都会想,如果有个懂行的帮帮手就好了,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构则是收取一定比例的托管管理费用。其实,

其实,以上所讲述的例子就用到了外观模式,这话又该怎么去理解呢?大家不妨思考一下,如果我们直接去买基金或者找专业的经理人,那么我们就不需要去了解股票具体的一些操作了,而且也不需要额外去了解债券、外汇等这些知识了,我们只需要把咱的资金交由经理人或者基金就行,至于经理人或者基金到底是投资股票,还是债券,还是外汇,我们并不需要去关注。这种思想就是今天我要讲的外观模式。

那到底什么是外观模式呢?接下来,我们就来看看外观模式的概念。

外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一的接口(你可以将其理解为上例中的基金,具体基金里面到底是投资股票,还是债券,还是外汇,咱们并不关注,因为这是由子系统来实现的),外部应用程序不用关心内部子系统的具体的细节,这样就大大降低了应用程序的复杂度,并提高了程序的可维护性。

还有一点需要大家知道,外观(Facade)模式是"迪米特法则"的典型应用。我们可以来看一下下面这张图。

先看上图左边部分,大的矩形表示的就是一个子系统,子系统里面有很多很多的类,对于访问者来说,只有了解了子系统里面的实之后,他才能更好的去使用子系统,这是在没有使用外观模式的情况下对子系统的一个访问,很明显,这增加了访问者访问的难度。

再来看上图右边部分,这是在使用外观模式的情况下对子系统的一个访问,此时,对于访问者来说,他并不需要去关注这个子系统里面是如何实现的,而是只需要去调用对外提供的统一的接口就可以正常的去访问它了,比如上面我所讲述的基金,炒股者只需要去了解基金就可以了,至于基金最终到底是去投资股票,还是债券,还是外汇,炒股者并不需要去关注,这样是不是就可以大大地降低了访问者使用子系统类的一个成本啊?其实,这也是外观模式的一个好处。

结构

理解了外观模式的概念之后,接下来,我们来看一下外观模式所包含的角色。

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

这样,对于访问者来说,他并不需要去关注子系统,而只需要关注外观角色就行,因为我们到时候是要通过外观角色去使用子系统里面的那些对象的。

外观模式案例

接下来,我们来实现一个外观模式的案例,通过该案例大家再去理解一下外观模式,这个案例就是智能家电控制。

分析

小明的爷爷已经60岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;操作起来都比较麻烦。所以小明给爷爷买了一个智能音箱,可以通过语音直接控制这些智能家电的开启和关闭。

阅读完上面的描述,我们知道智能音箱代表的就是外观角色,客户只需要和这个智能音箱进行交互即可。

下面我们再来看一下这张类图。

从以上类图中可以看到,有一个电灯类(即Light),它里面有两个方法,一个是开启电灯(即on方法),一个是关闭电灯(即off方法);也有一个电视类(即TV),它里面也有两个方法,一个是开启电视(即on方法),一个是关闭电视(即off方法);还有一个空调类(即AirCondition),它里面也是有两个方法,一个是开启空调(即on方法),一个是关闭空调(即off方法)。

以上类都不太重要,重要的是SmartAppliancesFacade类,它是一个外观类,它里面聚合了Light、TV、AirCondition等等这些类;除此之外,它里面还提供了一个无参构造及say方法,通过该say方法,我们就可以通过语音直接控制这些智能家电的开启和关闭了;最后,它里面还提供了两个方法,一个用来一键开启所有智能家电的(即on方法),一个是用来一键关闭所有智能家电的(即off方法),注意了,这俩方法都是私有的,因为这俩方法都只在say方法里面被调用。

以上类图分析完了以后,接下来,我们就要开始编写代码实现以上案例了。

实现

。。。

以上是关于从零开始学习Java设计模式 | 结构型模式篇:外观模式的主要内容,如果未能解决你的问题,请参考以下文章

从零开始学习Java设计模式 | 结构型模式篇:组合模式

从零开始学习Java设计模式 | 结构型模式篇:组合模式

从零开始学习Java设计模式 | 结构型模式篇:装饰者模式

从零开始学习Java设计模式 | 结构型模式篇:装饰者模式

从零开始学习Java设计模式 | 结构型模式篇:外观模式

从零开始学习Java设计模式 | 结构型模式篇:外观模式