前面介绍的适配器模式讲的是如何将一个接口转换成客户所需要的另一个接口,它的目的在于

解决接口的不兼容性问题。现在这里有这样一个模式,它的目的在于如何简化接口,它可以将多个类的复杂的一切隐藏在背后,只显露

出一个干净美观的外观。

晚上睡觉之前,你总是喜欢看电视,在你进入卧室的时候你需要完成以下几个步骤:打开电灯、打开空调、放心银幕(假如你家

有)、打开电视通过这么些繁琐的步骤后你终于可以看电视了,但是你要睡觉了呢?又要去进行繁琐的关闭动作。这里你就需要一个外观

模式了,通过实现一个更加合理的接口外观类将这些动作都包装起来,实现一键“看电视”、一键“关电视”。这就是外观模式的动机

一、模式定义

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

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

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

 二、模式结构

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

Facade: 外观角色

SubSystem:子系统角色

       三、模式实现

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

实例的UML图

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

public class Television {
public void on() {
System.out.println("打开了电视....");
} public void off() {
System.out.println("关闭了电视....");
}
}
public class Light {
public void on() {
System.out.println("打开了电灯....");
} public void off() {
System.out.println("关闭了电灯....");
}
}
public class AirCondition {
public void on() {
System.out.println("打开了空调....");
} public void off() {
System.out.println("关闭了空调....");
}
}
public class Screen {
public void up() {
System.out.println("升起银幕....");
} public void down() {
System.out.println("下降银幕....");
}
}
    然后是比较强大、干净、美观的外观
public class WatchTvSwtichFacade {
Light light;
AirCondition ac;
Television tv;
Screen screen; public WatchTvSwtichFacade(Light light, AirCondition ac, Television tv, Screen screen) {
this.light = light;
this.ac = ac;
this.tv = tv;
this.screen = screen;
} public void on() {
light.on(); //首先开灯
ac.on(); //然后是打开空调
screen.down(); //把银幕降下来
tv.on(); //最后是打开电视
} public void off() {
tv.off(); //首先关闭电视机
screen.up(); //银幕升上去
ac.off(); //空调关闭
light.off(); //最后关灯
}
}

客户端

public class Client {
public static void main(String[] args) {
//实例化组件
Light light = new Light();
Television tv = new Television();
AirCondition ac = new AirCondition();
Screen screen = new Screen(); WatchTvSwtichFacade watchTv = new WatchTvSwtichFacade(light, ac, tv, screen); watchTv.on();
System.out.println("--------------可以看电视了.........");
watchTv.off();
System.out.println("--------------可以睡觉了...........");
}
}

运行结果

打开了电灯....
打开了空调....
下降银幕....
打开了电视....
--------------可以看电视了.........
关闭了电视....
升起银幕....
关闭了空调....
关闭了电灯....
--------------可以睡觉了...........

  

从上面的使用通过使用外观模式,客户可以非常方便的实现比较复杂的功能。

         四、模式优缺点

优点

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

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

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

         缺点

    1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性

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

五、使用场景

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

2、客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和

可移植性

         六、模式总结

         1、  外观模式的主要优点就在于减少了客户与子系统之间的关联对象,使用客户对子系统的使用变得简单了,也实现了客户与子

系统之间的松耦合关系。它的缺点就在于违背了“开闭原则”。

          2、  如果需要实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行。

最新文章

  1. 4、项目的培训 - PMO项目管理办公室
  2. ms sql 2005和2008收缩日志的方法
  3. load/get延迟加载和及时加载
  4. linux下如何开启oracle服务和开启监听
  5. 【转】Swift开源项目精选
  6. SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
  7. 转】Linux下安装Tomcat服务器和部署Web应用
  8. 1.6.8 Content Streams
  9. Visual Studio 2010中创建ASP.Net Web Service
  10. zookeeper使用场景【转】
  11. android中如何处理cookie
  12. C#基础:异步调用 【转】
  13. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )
  14. 一次完整的HTTP请求所经历的7个步骤(前三步是浏览器工作,后四步是服务器工作)
  15. hdu 4884 TIANKENG’s rice shop(模拟)
  16. 扩展BaseAdapter实现不存储列表项的ListView
  17. glReadPixel 读取数据错误问题
  18. Tensorflow Chapter-6
  19. linux 创建sudo账号.md
  20. c#中日期格式化

热门文章

  1. 20190716NOIP模拟赛T1 礼物(概率dp+状压)
  2. docker打包flask简单程序
  3. 7.6 T1 深度优先搜索(dfs)
  4. AcWing:131. 直方图中最大的矩形(贪心 + 单调栈)
  5. svn 同步备份的所有问题,亲测可用
  6. C++入门经典-例7.7-对象与复制,菌类的繁殖
  7. SolrCloud配置
  8. 用Intellij idea搭建solr调试环境
  9. LC 966. Vowel Spellchecker
  10. 远程管理控制ssh