Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。它是为子系统中的一组接口所提供的一个一致的界面
应用:重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的、统一的接口,供上层应用使用。
听起来有点高端,其实很简单,用一个简单的例子说明下
在写一个简单的tomcat容器时,需要在一个处理器类ServletProcessor里面把request,response这两个对象传递给Servlet类的service(request, response)方法供servlet开发人员使用:
((Servlet)ServletClass.newInstance()).service(request, response);
这里的传递的request和response对象由tomcat开发人员创建,除了实现继承自javax.sevrlet.request接口和javax.servlet.response接口的方法外它们还有各自的公共方法,
把这样的对象直接给servlet开发人员存在一个安全隐患,servlet开发人员可以将request,和response对象做向上转型之后调用它们自己的公共方法,但这些方法在servlet中应该是不可用的! how to awoid this problem?
it's very easy:
我们利用组合的方式分别建立request和response的外观类
它们的结构大致如下
RequestFacade
public class RequestFacade implements ServletRequest {
private Request request;
public RequestFacade(Request request) {
this.request = request;
}
@Override
public AsyncContext getAsyncContext() {
return request.getAsyncContext();
}
@Override
public Object getAttribute(String arg0) {
return request getAttribute(arg0).;
}
//省略了ServletRequest接口里的众多方法
}
ResponseFacade
public class ResponseFacade implements ServletResponse {
private Response response;
public ResponseFacade(Response response) {
this.response = response;
}
@Override
public void flushBuffer() throws IOException {
response.flushBuffer();
}
//省略了ServletResponse接口里的众多方法
}
然后通过request和response初始它们的外观类对象,并把它们的外观类对象传给Service()方法即可:
RequestFacade requestFacade = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);
try {
((Servlet)ServletClass.newInstance()).service(requestFacade, responseFacade);
} catch (InstantiationException | IllegalAccessException | ServletException | IOException e) {
PubUtil.error("ServletProcessor --- process3 ---Exception"+e.getMessage());
return;
}
RequestFacade 外观类包含类request,并且和request类都继承了ServletRequest接口,所以servlet程序员就可以通过外观类来调用ServletRequest接口的所有方法,同时有效屏蔽了request类自己的公共方法。ResponseFacade具有同样的功能。
网友评论