门面模式有如下作用:
- 为一个复杂子系统提供一个简单接口
- 提高子系统的独立性
- 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
Tomcat的request使用了面门模式。利用门面模式把request的接口进行进一步封装。在servlet中使用的request实际上是requestFacade。
org.apache.catalina.connector.Request 和org.apache.catalina.connector.RequestFacade都继承了javax.servlet.http.HttpServletRequest。实际上在servlet中也是用父类HttpServletRequest作为方法的参数,只能使用javax.servlet.http.HttpServletRequest提供的方法。
Request类通过方法getRequest() 返回门面RequestFacade,在RequestFacade中把Request的接口进一步封装。
public HttpServletRequest getRequest() {
if (facade == null) {
facade = new RequestFacade(this);
}
return facade;
}
在http消息的传递过程中,在传递到servlet之前在org.apache.catalina.core.StandardWrapperValve.invoke()中,调用filterChain.doFilter(request.getRequest(),response.getResponse());
把传递的对象从Request转换成RequestFacade。此后Request变得不可见,用户操作对象只能是RequestFacade。这样通过门面实现了系统内部和外部操作对象的分离。