外观模式(Facade Pattern)为子系统中的接口提供了一个统一接口,用来访问子系统中的一组接口,这个模式定义了一个高层接口,该接口使得客户端调用系统更加地方便。外观模式主要通过定义一个接口,屏蔽内部子系统的细节,使得调用端只和这个接口发生调用,而无须关系系统的内部细节。外观模式是结构型模式的一种,本文将分析外观模式的原理及使用方式。
外观模式又叫门面模式,它的类图主要如下所示:
它的主要角色包括:
1.抽象接口(FacadeInterface):该接口是抽象的一个高层接口,规范了对外的调用方法;
2.外观角色(Facade):该类是抽象接口(FacadeInterface)的具体实现,内部实现了对子系统的具体调用,客户端可以调用这个角色的方法来完成对子系统内一组功能的操作;
3.子系统角色(SubSystem):每一个子系统都是一个单独的类,也可以是一个类的集合,实现了子系统具体的功能,每一个子系统都可以直接被客户端调用,也可以被外观角色直接调用,外观角色对于子系统来说就是一个客户端。
注意:在JAVA语言中,FacaeInterface这个接口其实并不是必须的,对于不同的客户端,可能需求也是不同,无法提供统一的接口对所有的客户端,客户端真正关系的还是所调用的外观角色(Facade),因此上述类图可以直接进行缩减成如下模式:
针对上述类图的代码如下:
public class Facade
{
private SubSystemA subSystemA = new SubSystemA();
private SubSystemB subSystemB = new SubSystemB();
private SubSystemC subSystemC = new SubSystemC();
public void method()
{
subSystemA.method();
subSystemB.method();
subSystemC.method();
}
}
public class SubSystemA
{
public void method()
{
System.out.println("子系统A");
}
}
public class SubSystemB
{
public void method()
{
System.out.println("子系统B");
}
}
public class SubSystemC
{
public void method()
{
System.out.println("子系统C");
}
}
//测试代码如下
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}
1.外观模式对外展蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性;
2.外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展,通过合理的使用外观模式,可以帮我们更好的划分访问的层次;
3.当系统需要进行分层设计时,可以考虑使用Facade模式;
4.不能过多的或者不合理的使用外观模式,需要根据场景选择使用外观模式,不应为了使用模式而使用,大道至简;
5.外观模式是相对简单的一种设计模式。
1.《设计模式-可复用面向对象软件的基础》-Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
2.《可复用物联网Web3D框架的设计与实现》-程亮(知网)
3.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式