定义
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
外观模式中所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统。子系统类通常是一些业务类,实现了一些具体的、独立的业务功能。
UML类图
代码实现
Facade.java
public class Facade {
private MethodA methodA;
private MethodB methodB;
private MethodC methodC;
public Facade() {
methodA = new MethodA();
methodB = new MethodB();
methodC = new MethodC();
}
public void method() {
methodA.method();
methodB.method();
methodC.method();
}
}
MethodA.java
public class MethodA {
public void method() {
System.out.println("MethodA");
}
}
MethodB.java
public class MethodB {
public void method() {
System.out.println("MethodB");
}
}
MethodC.java
public class MethodC {
public void method() {
System.out.println("MethodC");
}
}
Main.java
Facade facade = new Facade();
facade.method();
优缺点
主要优点
-
它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
-
它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
-
一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
主要缺点
-
不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活 性。
-
如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。