外观模式

84 阅读2分钟

1.什么是外观模式

外观模式也叫做“子过程模式”,这种模式的核心思想就是为不同的子类提供一个一致的界面类。通俗的讲就是将低层次的子系统类的信息封装在一个高层次的类中,这个高层次的类也叫做外观类。

2.外观模式的校色

  • FacadeClass(外观类):封装了子系统类的信息,为子系统提供了一个统一的接口。外观类知道当前的请求由哪些子系统负责,即外观类含有子系统类的对象信息,通过对象调用子系统类内的方法。
  • Subsystem(子系统类):功能的实际提供者,用于处理外观类指派来的任务,即由外观类中的对象调用类内的方法。
  • 客户端:调用外观类

3.引例说明

因为今天刚学习外观模式,这里我用一个可能不太恰当的例子来理解外观模式。

外观类可以用于实现客户端功能,比如我们熟悉的英雄联盟客户端,在我们匹配对局成功时,会进行英雄选择。我们可以将英雄选择界面看作一个外观类,界面里的英雄为封装在外观类内的子系统对象信息。我们只需要在客户端点击英雄并确定,就可以直接调用子系统类的方法。
比如我们锁定金克斯,就会出现这个英雄的专属语音"规则就是用来打破",这句话就可以理解为封装在子系统内的方法。

4.外观模式的UML类图

  • 子系统与外观类之间为聚合关系
  • 客户端与外观类之间为依赖关系(弱关联,有关系但关系不稳定,表现为局部变量和形参) 3cba01c60cee7683469af568c39e674c.jpg

5.外观模式实现

public class FacadePattern {
    public static void main(String[] args) {
        Facade f = new Facade();
        f.method();
    }
}
//外观角色
class Facade {
    private SubSystem01 obj1 = new SubSystem01();
    private SubSystem02 obj2 = new SubSystem02();
    private SubSystem03 obj3 = new SubSystem03();
    public void method() {
        obj1.method1();
        obj2.method2();
        obj3.method3();
    }
}
//子系统角色
class SubSystem01 {
    public void method1() {
        System.out.println("子系统01的method1()被调用!");
    }
}
//子系统角色
class SubSystem02 {
    public void method2() {
        System.out.println("子系统02的method2()被调用!");
    }
}
//子系统角色
class SubSystem03 {
    public void method3() {
        System.out.println("子系统03的method3()被调用!");
    }
}

运行结果如下:
子系统01的method1()被调用!
子系统02的method2()被调用!
子系统03的method3()被调用!

6.外观模式的扩展

当我们修改外观模式时,当增加或移动子系统时需要修改外观类,这违背了"开闭原则"。解决办法是引入抽象外观类,可以在一定程度上解决该问题。

image.png