概述
在这个高速发展的年代,无数莫名其妙的东西闯进了现代的生活,比如电视,怎么里面有人呢,电话,怎么就有声音呢,电脑,很普通,不过它到底怎么回事,好像无所不能,开机做了什么呢.
我想象一下,要是一个原始人跑到现代社会,肯定会很好奇这些.所有的东西都好像有魔法一般,但事实是大多数人都麻木了,往往会不屑一顾:"无聊,它本来就是这样的"
是的,我们没有人能有能力去记住我们所使用的东西是怎么工作的,我们只知道按power按钮开机,ok,它工作了,就这么简单.里面主板怎么开始通电,cpu怎么工作,硬盘怎么转,我晕,我需要了解吗.我需要的只是开机而已.
对,这就是外观模式了,简单就是美,当你看到一项电器,需要先看2天说明书才搞明白怎么开始工作,那么我恶意的猜想,这电器老板也离关门不远了.
外观模式解释来说就是为一组接口提供一个统一的接口,这个更高级的统一的接口直接引用下级所有接口的,使得这一组接口更容易使用.uml图如下
空白类就是一组接口,client现在使用就很简单了,只需要了解一个facade类而已,而不是看说明书分别去设置每个实例.
需求分析
来,我们现在来设计一个基本的家庭影院,首先,现在一个高清的蓝光播放器是必须的了,一个投影仪,屏幕要一个,要好的音质还得个好的功放.当然还要有气氛的话,一个爆米花制造机也来一个.
那么我们播放电影的时候,需要做什么呢,打开爆米花机,拿个爆米花,卷下屏幕,打开投影仪,设置灯光,打开播放器,插入光碟,打开功放,调节音量.
OMG,我想要的只是看电影而已,干嘛要我做这么多事情,so我们就需要建立一个Facade,来实现所有的设备操作.uml如下
现在复杂的事情变简单了,只有Facade的On,Off,WatchMovie 3项操作,简单的傻瓜都会操作了吧.
代码实现
剩下就是代码实现了,首先是5个设备的代码,如下
Amplifier.cs 功放
BlueRayPlayer.cs 蓝光播放器
PopcornPopper.cs 爆米花制造机
Projector.cs 投影
Screen.cs 屏幕
然后就是home theatre facade 的实现了,总共3个功能,on,off,watchmovie,代码如下
最后就是客户端实现了:
示例做了3个操作,On(),WatchMovie(),然后Off()
运行结果如下:
the PopcornPopper is On
pop the popcorn
roll down the screen
the Amplifier is On
set the bright 10
the BlueRayPlayer is On
the Amplifier is On
set volumn as 5
insert the movie Coraline
Watch the movie Coraline
the Amplifier is Off
the BlueRayPlayer is Off
the Amplifier is Off
roll up the screen
the PopcornPopper is Off
思考
外观模式优点在于client只需要跟一个类联系,就是hometheatre,而不需要跟大量的具体类联系,这也就是符合面向对象的一个重要原则:只跟你关系最密切的的类对话 .
这个原则在于降低类的复杂度,降低类之间的耦合度.
我们来看以下代码1:
再看以下代码2:
代码1需要对话的有2个类,1个station,1个Thermometer
代码2需要对话的有1个类,station
显然代码2更加松耦合,代码也更容易维护,不过有一点,station类需要加上方法GetTemperature().
那么我们为了尽量少的与其他类相关联,相对话,我们可以遵守以下原则:
我们尽量只跟以下4种对象对话.
1:传递过来的参数
2:类本身
3:在当前环境初始化的对象
4:类自带的组件
下一篇:《Head First Design Patterns》笔记九:模版模式(Template Method Pattern)
上一篇:《Head First Design Patterns》笔记七:适配器模式(Adapter Pattern)