《Head First Design Patterns》笔记八:外观模式(Facade Pattern)

概述

   在这个高速发展的年代,无数莫名其妙的东西闯进了现代的生活,比如电视,怎么里面有人呢,电话,怎么就有声音呢,电脑,很普通,不过它到底怎么回事,好像无所不能,开机做了什么呢.

   我想象一下,要是一个原始人跑到现代社会,肯定会很好奇这些.所有的东西都好像有魔法一般,但事实是大多数人都麻木了,往往会不屑一顾:"无聊,它本来就是这样的"

  是的,我们没有人能有能力去记住我们所使用的东西是怎么工作的,我们只知道按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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值