调侃《Head First设计模式》之外观模式

        上一篇谈了适配器模式,主要用于转换类的接口,今天谈外观模式,主要用于简化类的接口。照惯例由故事入手。

       现在你要建立自己的家庭电影院,你心目中完美的家庭影院系统包括:DVD播放器、投影机、自动屏幕、环绕立体声甚至还有爆米花机。

       看下这些组件的类图:

      调侃《Head First设计模式》之外观模式_第1张图片

   现在你好不容易将整个系统连起来了,准备播放电影了,播放电影你要执行以下步骤:

   调侃《Head First设计模式》之外观模式_第2张图片

   用代码实现就是:

   调侃《Head First设计模式》之外观模式_第3张图片

     这时候你应该很烦了:看个电影要打开这么多开关真TM烦!而且看完电影后还要把开关都关一遍,甚至听cd都很麻烦。怎么办呢?

     解决方案很简单,你需要的只是增加一个类将各种开关接口包装起来。如图HomeTheaterFacade类:

     调侃《Head First设计模式》之外观模式_第4张图片

     

     HomeTheaterFacade对外暴露几个接口,每个接口均是是对各种组件类的接口做相应的封装,之前调用的一系列方法现在一个方法搞定。具体类:

     调侃《Head First设计模式》之外观模式_第5张图片

    比如看电影相关方法:

    调侃《Head First设计模式》之外观模式_第6张图片

    调用一个方法实质调用了很多组件的开关方法。很方便是不?

   客户端只要把各个组件的对象引用传入HomeTheaterFacade类就行了。

   来看官方定义:

   外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

   类图如下:

   调侃《Head First设计模式》之外观模式_第7张图片


     外观模式不仅简化了接口,还将客户从组件的子系统中解耦。另外的一个好处是,外观在简化接口的同时,仍然将系统完整暴露出来,只要有需要,客户端依然可以直接使用子系统的类。

     提到外观模式,就不得不提一个重要的OO原则:

     “最少知识”原则:只和你的密友谈话。

     它告诉我们,不要让太多类相互依赖,不然系统会成为一个易碎的系统,需要花费很多成本维护。

     这个原则提供了一个方针避免类依赖:对于一个对象来说,我们只应该调用属于以下范围的方法:

    1.该对象本身的方法。

    2.方法参数传进来的对象的方法。

    3.该对象方法创建的对象的方法。

    4.对象的成员变量对象的方法。

    这个方针告诉我们,不要调用其他方法返回的对象的方法。

     

       

你可能感兴趣的:(设计模式,外观模式)