外观模式(Facade Pattern)

2018-08-15  本文已影响0人  luoqiang108

1. 介绍

1.1 定义&图解

定义了一个高层、统一的接口,外部通过这个统一的接口对子系统中的一群接口进行访问。

通过创建一个统一的外观类,用来包装子系统中一个或多个复杂的类,客户端可以通过调用这个外观类的方法来调用内部子系统中所有方法。

图解:


外观模式图解1.png

网站的导航例子:以前我需要在搜索栏逐个搜索网站地址,有了网站导航(外观模式)后,就方便很多了,如下图。


外观模式图解2.png

1.2 主要作用

  1. 引入外观角色之后,用户只需要与外观角色交互;
  2. 用户与子系统之间的复杂逻辑关系由外观角色来实现。

1.3 解决的问题

2. 模式原理

2.1 UML类图 & 组成

外观模式UML.png

2.2 实例讲解

接下来我用一个实例来对建造者模式进行更深一步的介绍。

a. 实例概况

  1. 即用外观模式来为所有子系统设计一个统一的接口
  2. 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作

b. 代码如下

电器类

//灯类
public class SubSystemA_Light {
    public void on(){
        System.out.println("打开了灯...");
    }
    public void off(){
        System.out.println("关闭了灯...");
    }
}

//电视类
public class SubSystemB_Television {
    public void on(){
        System.out.println("打开了电视...");
    }
    public void off(){
        System.out.println("关闭了电视...");
    }
}

//空调类
public class SubSystemC_Aircondition {
    public void on(){
        System.out.println("打开了空调...");
    }
    public void off(){
        System.out.println("关闭了空调...");
    }
}

外观类:智能遥控器

public class Facade {
    private SubSystemA_Light light;
    private SubSystemB_Television television;
    private SubSystemC_Aircondition aircondition;
    //构造方法传参
    public Facade(SubSystemA_Light light,SubSystemB_Television television,SubSystemC_Aircondition aircondition){
        this.light = light;
        this.television  = television ;
        this.aircondition =aircondition;
    }
    //起床后一键开电器
    public void on(){
        System.out.println("起床了");
        light.on();
        television.on();
        aircondition.on();
    }
    //睡觉时一键关电器
    public void off(){
        System.out.println("睡觉了");
        light.off();
        television.off();
        aircondition.off();
    }
}

客户端调用

public class FacadePattern {
    public static void main(String[] args){
        SubSystemA_Light light = new SubSystemA_Light();
        SubSystemB_Television television = new SubSystemB_Television();
        SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition();

        /***********不使用外观模式时的情况***********/
        //起床后开电器
        System.out.println("起床了");
        light.on();
        television.on();
        aircondition.on();
        System.out.println("可以看电视了");
        //睡觉时关电器
        System.out.println("睡觉了");
        light.off();
        television.off();
        aircondition.off();
        System.out.println("可以睡觉了");
        System.out.println("----------------------------------------");

        /***********使用外观模式时的情况***********/
        //外观模式构造方法传参
        Facade facade = new Facade(light,television,aircondition);
        //客户端直接与外观对象进行交互
        facade.on();
        System.out.println("可以看电视了");
        facade.off();
        System.out.println("可以睡觉了");
    }
}

输出结果

起床了
打开了灯...
打开了电视...
打开了空调...
可以看电视了
睡觉了
关闭了灯...
关闭了电视...
关闭了空调...
可以睡觉了
----------------------------------------
起床了
打开了灯...
打开了电视...
打开了空调...
可以看电视了
睡觉了
关闭了灯...
关闭了电视...
关闭了空调...
可以睡觉了

c. 解释说明

  1. 从上面客户端调用的情况可以看出,在不使用外观模式的情况下,小成爷爷需要对每个电器都进行操作,非常不方便。
  2. 客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统。

3. 优缺点

3.1 优点

  1. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
  2. 减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系,松耦合使得子系统的组件变化不会影响到它的客户。
  1. 引入外观角色之后,用户只需要与外观角色交互;
  2. 用户与子系统之间的复杂逻辑关系由外观角色来实现。

因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

3.2 缺点

4. 应用场景

引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

4. 感谢

外观模式(Facade Pattern) - 最易懂的设计模式解析

上一篇 下一篇

猜你喜欢

热点阅读