外观模式

前面介绍的适配器模式(设计模式读书笔记-----适配器模式)讲的是如何将一个接口转换成客户所须要的另外一个接java

口,它的目的在于解决接口的不兼容性问题。如今这里有这样一个模式,它的目的在于如何简化接口,它能够将多个设计模式

类的复杂的一切隐藏在背后,只显露出一个干净美观的外观。this

         

         晚上睡觉以前,你老是喜欢看电视,在你进入卧室的时候你须要完成如下几个步骤:打开电灯、打开空调、放spa

心银幕(假如你家有)、打开电视经过这么些繁琐的步骤后你终于能够看电视了,可是你要睡觉了呢?又要去进行繁琐.net

的关闭动做。这里你就须要一个外观模式了,经过实现一个更加合理的接口外观类将这些动做都包装起来,实现一设计

键“看电视”、一键“关电视”。这就是外观模式的动机orm


         1、模式定义对象

         所谓外观模式就是提供一个统一的接口,用来访问子系统中的一群接口。blog

         外观模式定义了一个高层接口,让子系统更容易使用。以下图,是使用外观模式后将子系统的使用变得更加简单。接口

         在引入外观模式后,客户只须要与外观角色打交道,客户与子系统的复杂关系有外观角色来实现,从而下降了

系统的耦合度。


         2、模式结构



         外观模式包含以下两个角色:

            Facade: 外观角色

            SubSystem:子系统角色

 

       3、模式实现

         场景就是上面那个“睡觉看电视”的场景。

实例的UML图


首先是四个组件(电视、电灯、空调、银幕)

[java] view plaincopyprint?

  1. public class Television {  

  2.     public void on(){  

  3.         System.out.println("打开了电视....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("关闭了电视....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class Light {  

  2.     public void on(){  

  3.         System.out.println("打开了电灯....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("关闭了电灯....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class AirCondition {  

  2.     public void on(){  

  3.         System.out.println("打开了空调....");  

  4.     }  

  5.       

  6.     public void off(){  

  7.         System.out.println("关闭了空调....");  

  8.     }  

  9. }  


[java] view plaincopyprint?

  1. public class Screen {  

  2.     public void up(){  

  3.         System.out.println("升起银幕....");  

  4.     }  

  5.       

  6.     public void down(){  

  7.         System.out.println("降低银幕....");       

  8.     }  

  9. }  


而后是比较强大、干净、美观的外观

[java] view plaincopyprint?

  1. public class WatchTvSwtichFacade {  

  2.     Light light;  

  3.     AirCondition ac;  

  4.     Television tv;  

  5.     Screen screen;  

  6.       

  7.     public WatchTvSwtichFacade(Light light,AirCondition ac,Television tv,Screen screen){  

  8.         this.light = light;  

  9.         this.ac = ac;  

  10.         this.tv = tv;  

  11.         this.screen = screen;  

  12.     }  

  13.       

  14.     public void on(){  

  15.         light.on();       //首先开灯  

  16.         ac.on();          //而后是打开空调  

  17.         screen.down();    //把银幕降下来  

  18.         tv.on();          //最后是打开电视  

  19.     }  

  20.       

  21.     public void off(){  

  22.         tv.off();         //首先关闭电视机  

  23.         screen.up();      //银幕升上去  

  24.         ac.off();         //空调关闭  

  25.         light.off();      //最后关灯  

  26.     }  

  27. }  


客户端

[java] view plaincopyprint?

  1. public class Client {  

  2.     public static void main(String[] args) {  

  3.         //实例化组件  

  4.         Light light = new Light();  

  5.         Television tv = new Television();  

  6.         AirCondition ac = new AirCondition();  

  7.         Screen screen = new Screen();  

  8.           

  9.         WatchTvSwtichFacade watchTv = new WatchTvSwtichFacade(light, ac, tv, screen);  

  10.           

  11.         watchTv.on();  

  12.         System.out.println("--------------能够看电视了.........");  

  13.         watchTv.off();  

  14.         System.out.println("--------------能够睡觉了...........");  

  15.     }  

  16. }  


运行结果


从上面的使用经过使用外观模式,客户能够很是方便的实现比较复杂的功能。


4、模式优缺点

 优势

 一、引入外观模式,是客户对子系统的使用变得简单了,减小了与子系统的关联对象,实现了子系统与客户之间

的松耦合关系。

 二、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类

 三、下降了大型软件系统中的编译依赖性,并简化了系统在不一样平台之间的移植过程

  缺点

   一、不能很好地限制客户使用子系统类,若是对客户访问子系统类作太多的限制则减小了可变性和灵活性

   二、在不引入抽象外观类的状况下,增长新的子系统可能须要修改外观类或客户端的源代码,违背了“开闭原则”


 5、使用场景

   一、当要为一个复杂子系统提供一个简单接口时能够使用外观模式。

   二、客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其余子系统解耦,能够提

高子系统的独立性和可移植性


   6、模式总结

   一、  外观模式的主要优势就在于减小了客户与子系统之间的关联对象,使用客户对子系统的使用变得简单了,

也实现了客户与子系统之间的松耦合关系。它的缺点就在于违背了“开闭原则”。

   二、  若是须要实现一个外观模式,须要将子系统组合进外观中,而后将工做委托给子系统执行。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息