定义
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
模式结构
角色职责
外观(Facade)模式包含以下主要角色。
1.外观(Facade)角色:为多个子系统对外提供一个共同的接口。
2.子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
3.客户(Client)角色:通过一个外观角色访问各个子系统的功能。
代码实现
外观角色:
public class Facade {
private SubSystem01 onj1 = new SubSystem01();
private SubSystem02 onj2 = new SubSystem02();
private SubSystem03 onj3 = new SubSystem03();
public void method(){
onj1.method1();
onj2.method2();
onj3.method3();
}
}
子系统角色:
public class SubSystem01 {
public void method1() {
System.out.println("子系统01的method1()被调用!");
}
}
public class SubSystem02 {
public void method2() {
System.out.println("子系统02的method2()被调用!");
}
}
public class SubSystem03 {
public void method3() {
System.out.println("子系统03的method3()被调用!");
}
}
客户端角色:
public class FacadePattern {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}
控制台输出结果:
子系统01的method1()被调用!
子系统02的method2()被调用!
子系统03的method3()被调用!
适用场景
1.当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
2.客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
3.在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
优缺点
优点:
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
缺点:
不符合开闭原则。