上一篇谈了适配器模式,主要用于转换类的接口,今天谈外观模式,主要用于简化类的接口。照惯例由故事入手。
现在你要建立自己的家庭电影院,你心目中完美的家庭影院系统包括:DVD播放器、投影机、自动屏幕、环绕立体声甚至还有爆米花机。
看下这些组件的类图:
现在你好不容易将整个系统连起来了,准备播放电影了,播放电影你要执行以下步骤:
用代码实现就是:
这时候你应该很烦了:看个电影要打开这么多开关真TM烦!而且看完电影后还要把开关都关一遍,甚至听cd都很麻烦。怎么办呢?
解决方案很简单,你需要的只是增加一个类将各种开关接口包装起来。如图HomeTheaterFacade类:
HomeTheaterFacade对外暴露几个接口,每个接口均是是对各种组件类的接口做相应的封装,之前调用的一系列方法现在一个方法搞定。具体类:
比如看电影相关方法:
调用一个方法实质调用了很多组件的开关方法。很方便是不?
客户端只要把各个组件的对象引用传入HomeTheaterFacade类就行了。
来看官方定义:
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
类图如下:
外观模式不仅简化了接口,还将客户从组件的子系统中解耦。另外的一个好处是,外观在简化接口的同时,仍然将系统完整暴露出来,只要有需要,客户端依然可以直接使用子系统的类。
提到外观模式,就不得不提一个重要的OO原则:
“最少知识”原则:只和你的密友谈话。
它告诉我们,不要让太多类相互依赖,不然系统会成为一个易碎的系统,需要花费很多成本维护。
这个原则提供了一个方针避免类依赖:对于一个对象来说,我们只应该调用属于以下范围的方法:
1.该对象本身的方法。
2.方法参数传进来的对象的方法。
3.该对象方法创建的对象的方法。
4.对象的成员变量对象的方法。
这个方针告诉我们,不要调用其他方法返回的对象的方法。