第五章 5.5 外观模式

分类:01_设计模式

标签:

5.5.1 外观模式介绍

外观模式( Facade Pattern),也叫门面模式, 外观模式的原始定义是:为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口,使子系统更易于使用。

外观模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

门面模式有点类似之前讲到的迪米特法则(最少知识原则)和接口隔离原则:两个有交互的系统,只暴露有限的必要的接口

91.jpg

门面类充当了系统中的"服务员",它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互,如果没有门面类,每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将会很大.

5.5.2 外观模式原理

92.jpg

外观(Facade)模式包含以下主要角色:

代码示例


public class SubSystemA {

   public void methodA(){
       //业务代码
   }
}

public class SubSystemB {

   public void methodB(){
       //业务代码
   }
}

public class SubSystemC {

   public void methodC(){
       //业务代码
   }
}

public class Facade {

   private SubSystemA obj1 = new SubSystemA();
   private SubSystemB obj2 = new SubSystemB();
   private SubSystemC obj3 = new SubSystemC();

   public void method(){

       obj1.methodA();
       obj2.methodB();
       obj3.methodC();
   }
}

public class Client {

   public static void main(String[] args) {

       Facade facade = new Facade();
       facade.method();
   }
}


5.5.3 外观模式应用实例

智能家电控制

类图如下

93.jpg

代码如下

public class Light {

   public void on(){

       System.out.println("打开灯......");
   }

   public void off(){

       System.out.println("关闭灯......");
   }
}

public class TV {

   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 SmartAppliancesFacade {

   private Light light;

   private TV tv;

   private AirCondition airCondition;

   public SmartAppliancesFacade() {
       this.light =new Light();
       this.tv = new TV();
       this.airCondition = new AirCondition();
   }

   public void say(String message){
       if(message.contains("打开")){
           on();
       }else if(message.contains("关闭")){
           off();
       }else{
           System.out.println("对不起没有听清楚您说什么! 请重新再说一遍");
       }

   }


   //起床后 语音开启 电灯 电视 空调
   private void on() {
       System.out.println("起床了!");
       light.on();
       tv.on();
       airCondition.on();
   }

   //睡觉前 语音关闭 电灯 电视 空调
   private void off() {
       System.out.println("睡觉了!");
       light.off();
       tv.off();
       airCondition.off();
   }
}

public class Client {

   public static void main(String[] args) {

       //创建外观对象
       SmartAppliancesFacade facade = new SmartAppliancesFacade();

       facade.say("打开家电");
       facade.say("关闭家电");
   }
}


5.5.4 外观模式总结

外观模式的优点:

  1. 它对客户端屏蔽了子系统组件,减少了客户端所需要处理的对象数目,并使子系统使用起来更加的容易.通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少.

  2. 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可

  3. 一个子系统的修改对其他子系统没有任何影响,而子系统内部变化也不会影响到外观对象.

外观模式缺点:

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

  2. 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则.

使用场景分析:


修改内容