门面模式
认识
提供一个门面去调用系统各个子模块,客户端调用门面,减少客户端与系统中各个子模块的交互,松散耦合,
思考
Facade知道各个子模块,而各个子模块不应该知道Facade的存在
客户端也可以直接调用各个子模块,有外观也可以不使用
使用场景
当需要调用系统内部多个子模块的时候,为了避免客户端分别调用子模块,提供一个门面,让门面分别去调用各个子模块,然后客户端直接调用门面,隐藏内部的细节。
优缺点
优点
- 松散耦合:松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护
- 简单易用:门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了
- 更好的划分访问层次:通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
缺点
UML图
门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
门面(facade): 客户端通过门面,访问内部系统的各个模块。
子系统(SubSystem):每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
代码实现
public class ModuleA {
//示意方法
public void testA(){
System.out.println("调用ModuleA中的testA方法");
}
}
public class ModuleB {
//示意方法
public void testB(){
System.out.println("调用ModuleB中的testB方法");
}
}
public class ModuleC {
//示意方法
public void testC(){
System.out.println("调用ModuleC中的testC方法");
}
}
public class Facade {
//示意方法,满足客户端需要的功能
public void test(){
ModuleA a = new ModuleA();
a.testA();
ModuleB b = new ModuleB();
b.testB();
ModuleC c = new ModuleC();
c.testC();
}
}