1.什么是外观模式
外观模式也叫做“子过程模式”,这种模式的核心思想就是为不同的子类提供一个一致的界面类。通俗的讲就是将低层次的子系统类的信息封装在一个高层次的类中,这个高层次的类也叫做外观类。
2.外观模式的校色
- FacadeClass(外观类):封装了子系统类的信息,为子系统提供了一个统一的接口。外观类知道当前的请求由哪些子系统负责,即外观类含有子系统类的对象信息,通过对象调用子系统类内的方法。
- Subsystem(子系统类):功能的实际提供者,用于处理外观类指派来的任务,即由外观类中的对象调用类内的方法。
- 客户端:调用外观类
3.引例说明
因为今天刚学习外观模式,这里我用一个可能不太恰当的例子来理解外观模式。
外观类可以用于实现客户端功能,比如我们熟悉的英雄联盟客户端,在我们匹配对局成功时,会进行英雄选择。我们可以将英雄选择界面看作一个外观类,界面里的英雄为封装在外观类内的子系统对象信息。我们只需要在客户端点击英雄并确定,就可以直接调用子系统类的方法。
比如我们锁定金克斯,就会出现这个英雄的专属语音"规则就是用来打破",这句话就可以理解为封装在子系统内的方法。
4.外观模式的UML类图
- 子系统与外观类之间为聚合关系
- 客户端与外观类之间为依赖关系(弱关联,有关系但关系不稳定,表现为局部变量和形参)
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.外观模式的扩展
当我们修改外观模式时,当增加或移动子系统时需要修改外观类,这违背了"开闭原则"。解决办法是引入抽象外观类,可以在一定程度上解决该问题。