外观模式又称门面模式, 所谓外观,就是为子系统对外提供的一组接口提供一个统一的界面,使其他系统对该系统的访问都是通过这个统一界面来完成的。
我们来看一个小例子:
某系统有三个类A类、B类、C类,分别完成某项功能:
package com.dxy.design.pattern.builder.facade;
public class A {
public static void doSomething() {
System.out.println("A完成某事");
}
}
package com.dxy.design.pattern.builder.facade;
public class B {
public static void doSomething() {
System.out.println("B完成某事");
}
}
package com.dxy.design.pattern.builder.facade;
public class C {
public static void doSomething() {
System.out.println("C完成某事");
}
}
客户端需要分别调用A、B、C三类中的doSomething来完成特定功能,通常我们会这样来调用:
package com.dxy.design.pattern.builder.facade;
public class Client {
public static void main(String[] args) {
A.doSomething();
B.doSomething();
C.doSomething();
}
}
这样做虽然能达到要求,但每次必须的和A、B、C类打交道才能完成规定实现,这很麻烦,这时我们只需要引入facade类:
package com.dxy.design.pattern.builder.facade;
public class Facade {
public void aDoSomeThing() {
A.doSomething();
}
public void bDoSomeThing() {
B.doSomething();
}
public void cDoSomeThing() {
C.doSomething();
}
}
这样我们每次只用Facede类就能完成规定实现:
package com.dxy.design.pattern.builder.facade;
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.aDoSomeThing();
facade.bDoSomeThing();
facade.cDoSomeThing();
}
}
使用facade模式避免了外部系统和子系统之间的直接联系,从而降低了系统之间的依赖和复杂度,但这样做会限制外部系统对仔细通过调用的灵活性,只能按照外传类提供的方式对子系统进行调用。
上述示例UML图如下: