模式定义:为锡系统中的一组接口提供一个一致的接口,facade模式定义了一个高层接口,这个接口使得子系统更加容易
实现:
public class FacadeTest {
public static void main(String[] args) {
/**
* Facade类其实相当于A、B、C模块的外观界面,有了这个Facade类,
* 那么客户端就不需要亲自调用子系统中的A、B、C模块了,也不需要知道系统内部的实现细节,
* 甚至都不需要知道A、B、C模块的存在,客户端只需要跟Facade类交互就好了,
* 从而更好地实现了客户端和子系统中A、B、C模块的解耦,
* 让客户端更容易地使用系统。
*/
Facade facade = new Facade();
facade.test();
}
}
/**
* 门面角色类:
*/
class Facade {
//示意方法,满足客户端需要的功能
public void test(){
ModuleA a = new ModuleA();
a.testA();
ModuleB b = new ModuleB();
b.testB();
ModuleC c = new ModuleC();
c.testC();
}
}
/**
* 子系统角色中的类:A B C
*/
class ModuleA {
//示意方法
public void testA(){
System.out.println("调用ModuleA中的testA方法");
}
}
class ModuleB {
//示意方法
public void testB(){
System.out.println("调用ModuleB中的testB方法");
}
}
class ModuleC {
//示意方法
public void testC(){
System.out.println("调用ModuleC中的testC方法");
}
}
门面模式的优点
-
松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
-
简单易用: 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
-
更好的划分访问层次: 通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
例如在tomcat下的:
- org.apache.catalina.connector.RequestFacade
- org.apache.catalina.connector.ResponseFacade