门面模式
门面模式属于设计模式中的结构型模式,外部与一个子系统通信需要通过一个统一的门面进行,门面模式提供一个高层次的接口,使得子系统易于使用。
门面模式的适用性
门面模式适用于pgfd要为一个复杂的子系统提供一个简单的接口时。子系统往往会因为不断地演化而变得越来越复杂,不易于使用者使用,门面模式可以提供一个简单的调用接口调用子系统,这样对大多数用户来说已经足够适用了,对于有特殊需求的用户来说可以直接越过门面对象直接对子系统的底层进行访问。
门面模式适用于客户端直接调用子系统的时候使得两者存在很大的依赖性,通过使用门面模式可以极大的将客户与子系统的耦合度降低,这样可以可以提高子系统的独立性和可移植性。
pgfd需要构建一个层次系统的时候,可以使用门面模式为每个子系统定义一个接口,如果这些子系统是相互依赖的可以定义一个接口使他们相互通信。
门面模式的结构图
由上图所示,门面模式总共只有两类角色:
门面角色(Facade):客户端通过调用门面角色提供的接口来访问子系统,门面角色知晓所有子系统的功能和责任,主要将客户的请求委派到子系统中去。
子系统角色(Subsystem):子系统角色是实际实现具体功能的部分,并且处理门面角色委派的任务。
门面模式的示例
首先我们声明一个子系统中的模块A、B、C三个模块,每个模块分别执行各自的功能:
模块A:
public classModuleA {public voidOperation() {
System.out.println(“操作模块A的功能”);
}
}
模块B:
public classModuleB {public voidOperation() {
System.out.println(“操作模块B的功能”);
}
}
模块C:
public classModuleC {public voidOperation() {
System.out.println(“操作模块C的功能”);
}
}
下面定义一个门面对象,可以按照既定的方式访问子系统中ABC三个模块各自的功能:
public classFacade {public voidOperation() {
ModuleA moduleA= newModuleA();
ModuleB moduleB= newModuleB();
ModuleC moduleC= newModuleC();
moduleA.Operation();
moduleB.Operation();
moduleC.Operation();
}
}
定义一个客户端来调用门面对象提供的接口:
public classClient {public static voidmain(String[] args) {
Facade facade= newFacade();
facade.Operation();
}
}
结果如下:
操作模块A的功能
操作模块B的功能
操作模块C的功能
通过门面模式的方式去调用子系统中各个模块的功能,这样就不需要客户端亲自去调用子系统中的A、B、C三个,这样客户端也不需要知道模块A、B、C的具体实现细节,客户端只需要与门面对象Facade交互就够了。
门面模式的优点
门面一共有以下优点:
1、降低了客户-子系统之间的耦合度。
通过使用门面模式,可以更加方便的扩展子系统中的各个小模块而不需要关心客户端是否需要作何改变。
2、门面模式使得子系统更简单易用
通过使用门面模式,客户端不需要关心子系统有多么复杂,只需要与门面角色提供的简单接口进行交互就够了。
3、更好的划分了访问的层次
使用门面模式,子系统可以提供公共接口和私有接口,部分的公共接口供门面角色给客户端使用,而私有子口可以扩展内部子系统的功能,这样既方便了客户端的使用,也很好的隐藏了子系统的实现细节。