1.声明
设计模式中的设计思想、图片和部分代码参考自《Head First设计模式》,作者Eric Freeman & Elisabeth Freeman & Kathy Siezza & Bert Bates。
在这里我只是对这本书进行学习阅读,并向大家分享一些心得体会。
2.设计家庭影院
在适配器模式中,我们知道如何将一个类的接口转换成另一个符合符合客户期望的接口。Java要做到这一点,必须将一个不兼容目标接口的对象包装起来,变成兼容的对象。
此外还有另外一种模式,它也可以改变接口,但是它改变接口的原因是为了简化接口。这个模式被巧妙地命名为外观模式(Facadce-Pattern),之所以这么称呼,是因为它将一个或数个类的复杂的一切都隐藏在背后,只暴露出一个干净美好的外观。
2.1需求
很多人都爱去电影院看电影,但是如果能够在家就体会到电影院的效果,那就更方便了。现在我们就准备设计一个"家庭电影院"这样的系统。
经过一番精心设计,现在组装了一套豪华的系统,包括Dvd播放机、Cd播放机、立体声、剧院屏幕等。并且我们又花费了好几天的时间进行系统布线、连接所有装置、调试等操作。系统类图如下:
2.2最初的家庭影院系统
类图:
现在我们开始运行系统,开始准备观看喜爱的电影。
播放电影(使用最初的影院系统):
- 打开爆米花机
- 开始爆米花
- 灯光调暗
- 放下屏幕
- 打开投影机
- 投影机的输入接到DVD
- 投影机设置为宽屏模式
- 打开功放
- 将功放的输入设置为DVD
- 功放设置为环绕立体声
- 调节音量到14
- 打开DVD播放器
- 开始播放DVD
将上述步骤转换成代码调用:
可以看到,电影的播放非常的繁琐,而且在观影结束后,还需要将操作再倒序操作一遍。这简直令人崩溃,那么外观模式是如何应对这类问题的。
2.3有外观模式改进的家庭影院
通过观察最初的设计方案,我们发现一个弊端,拿projector(投影仪)举例子,投影仪的打开、防止DVD、设置为宽屏模式这些都需要我们亲力亲为,显得很麻烦,那么我们可不可以将它封装一下,仅仅暴露出一个方法,这个方法将所有关于投影仪的操作都帮我们完成了呢?
这就是外观模式的设计初衷。现在我们可以设计一个新类HomeTheaterFacade,它为我们提供一下几种方法:看电影、关电影、听CD、关CD、听