前言
今天我们来看另一个改变接口的设计模式,不过它改变接口的原因是为了简化接口。这个模式被巧妙地叫做外观模式,之所以这么称呼,是因为它将一个或多个类的复杂的实现都藏在了背后,只显露出一个干净美好的外观。好了,下面我们就来展开分享下。
外观模式
外观模式提供了一个统一的接口,用来访问子系统中的一群接口,它定义了一个高层接口,让子系统更容易使用。下面是外观模式的一个模型图,核心的元素有三个,一个客户端,一个外观模式,另一块是很繁杂的子系统,其中外观模式这一层,主要是简化子系统的接口,为客户端提供更简洁的调用:
要点
- 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式
- 实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行
- 外观将客户从一个复杂的子系统中解耦
示例代码
下面我们通过一个很形象的日常生活示例,来说明外观模式具体的应用场景。
我们可以想象这样一个场景:下班回到家,你想看个电影,放松一下,但是你并没有感觉到很开心。因为考虑到要拖地,而且家里水壶还没水了,你还要烧个热水,还有自己找电影,想到这一切的一切,你突然放弃了想看电影的想法。
因为在正常情况下,每一步都要自己亲自操作:首先先打开家里的扫地机器人(这已经算高端了),然后接水烧水,之后才能打开电脑、找电影,整个过程操作完之后,你才能开始看电影,但是这时候你可能会感觉到更加疲惫。
但是假如,突然有一天你的生活开启了外观模式,那整个场景就完全不一样了。这时候回到家,你只需要一键操作,扫地、烧水、找电影都可以一气呵成,这样你就可以直接看自己喜欢的电影了,岂不是美滋滋!
下面我们就来详细看下这个一气呵成的方法,具体如何用代码来实现:
扫地操作
正常情况下,你要自己用扫把扫地,如果是扫地机器人的话,你至少需要启动下开关
public class Broom {
public void sweepFloor() {
System.out.println("扫帚正在扫地!");
}
}
烧水操作
烧水操作也一样,你要用水壶接水,然后烧水
public class Kettle {
public void boilWater() {
System.out.println("烧水壶正在接水!");
System.out.println("烧水壶正在烧水!");
}
}
搜索电影操作
紧接着你还要自己搜索电影,然后才能开始看电影
public class Computer {
public void searchVideo() {
System.out.println("电脑正在查找电影!");
System.out.println("电脑查找电影完成!");
}
}
外观模式
但是如果你的生活启用了外观模式,仅需一键操作,就可以完成以上操作,同时开始看电影,感觉这个痛苦的过程一下就消失了呢,是不是一下就感觉美滋滋了呢!
public class SystemFacade {
Broom broom = new Broom();
Kettle kettle = new Kettle();
Computer computer = new Computer();
public void facade() {
broom.sweepFloor();
kettle.boilWater();
computer.searchVideo();
System.out.println("开始播放电影!");
}
}
测试代码
好了,下面就让我们来一键操作吧!
@Test
public void testFacade() {
SystemFacade facade = new SystemFacade();
facade.facade();
}
然后我们就可以愉快地看电影了:
和适配器比较
- 外观模式不只是简化了接口,也将客户从组件的子系统中解耦
- 外观模式和适配器模式可以包装许多类,但是外观模式的意图是简化接口,而适配器的意图是将接口转换成不同的接口
总结
从上面的示例代码,以及我们举的生活中的例子,我们可以很清楚地看到,外观模式本质上就是整合接口,为客户端提供一个更简洁的接口。现实生活中,外观模式的例子还有很多,特别是在现在这种智能时代,比如小爱同学、小度以及我们的手机智能助手等,都是典型的外观模式。从这一点上来讲,人工智能确实改变了我们的生活,让生活的繁杂开始变得简单,语音搜索、语音控制各类电器……万物互联,真的是指日可待!
好了,关于外观模式我们就说这么多,总体来看这块的内容也确实不过。