设计模式学习之外观模式

转自:https://chenssy.blog.csdn.net/article/details/9428553

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

口,它的目的在于解决接口的不兼容性问题。现在这里有这样一个模式,它的目的在于如何简化接口,它可以将多个

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

         

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

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

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

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


         一、模式定义

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

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

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

系统的耦合度。


         二、模式结构



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

            Facade: 外观角色

            SubSystem:子系统角色

 

       三、模式实现

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

实例的UML图


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


 
 
  1. public class Television {
  2. public void on(){
  3. System.out.println( "打开了电视....");
  4. }
  5. public void off(){
  6. System.out.println( "关闭了电视....");
  7. }
  8. }


 
 
  1. public class Light {
  2. public void on(){
  3. System.out.println( "打开了电灯....");
  4. }
  5. public void off(){
  6. System.out.println( "关闭了电灯....");
  7. }
  8. }


 
 
  1. public class AirCondition {
  2. public void on(){
  3. System.out.println( "打开了空调....");
  4. }
  5. public void off(){
  6. System.out.println( "关闭了空调....");
  7. }
  8. }


 
 
  1. public class Screen {
  2. public void up(){
  3. System.out.println( "升起银幕....");
  4. }
  5. public void down(){
  6. System.out.println( "下降银幕....");
  7. }
  8. }

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


 
 
  1. public class WatchTvSwtichFacade {
  2. Light light;
  3. AirCondition ac;
  4. Television tv;
  5. Screen screen;
  6. public WatchTvSwtichFacade(Light light,AirCondition ac,Television tv,Screen screen){
  7. this.light = light;
  8. this.ac = ac;
  9. this.tv = tv;
  10. this.screen = screen;
  11. }
  12. public void on(){
  13. light.on(); //首先开灯
  14. ac.on(); //然后是打开空调
  15. screen.down(); //把银幕降下来
  16. tv.on(); //最后是打开电视
  17. }
  18. public void off(){
  19. tv.off(); //首先关闭电视机
  20. screen.up(); //银幕升上去
  21. ac.off(); //空调关闭
  22. light.off(); //最后关灯
  23. }
  24. }

客户端


 
 
  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. WatchTvSwtichFacade watchTv = new WatchTvSwtichFacade(light, ac, tv, screen);
  9. watchTv.on();
  10. System.out.println( "--------------可以看电视了.........");
  11. watchTv.off();
  12. System.out.println( "--------------可以睡觉了...........");
  13. }
  14. }

运行结果


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


四、模式优缺点

 优点

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

的松耦合关系。

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

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

  缺点

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

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


 五、使用场景

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

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

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


   六、模式总结

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

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值