Facade(外觀)模式為子系統(tǒng)中的各類(lèi)(或結(jié)構(gòu)與方法)提供一個(gè)簡(jiǎn)明一致的界面雇逞,隱藏子系統(tǒng)的復(fù)雜性户辫,使子系統(tǒng)更加容易使用闹司。它是為子系統(tǒng)中的一組接口所提供的一個(gè)一致的界面
應(yīng)用:重新進(jìn)行類(lèi)的設(shè)計(jì)嗓蘑,將原來(lái)分散在源碼中的類(lèi)/結(jié)構(gòu)及方法重新組合剥懒,形成新的内舟、統(tǒng)一的接口,供上層應(yīng)用使用蕊肥。
聽(tīng)起來(lái)有點(diǎn)高端谒获,其實(shí)很簡(jiǎn)單,用一個(gè)簡(jiǎn)單的例子說(shuō)明下
在寫(xiě)一個(gè)簡(jiǎn)單的tomcat容器時(shí)壁却,需要在一個(gè)處理器類(lèi)ServletProcessor里面把request,response這兩個(gè)對(duì)象傳遞給Servlet類(lèi)的service(request, response)方法供servlet開(kāi)發(fā)人員使用:
((Servlet)ServletClass.newInstance()).service(request, response);
這里的傳遞的request和response對(duì)象由tomcat開(kāi)發(fā)人員創(chuàng)建,除了實(shí)現(xiàn)繼承自javax.sevrlet.request接口和javax.servlet.response接口的方法外它們還有各自的公共方法裸准,
把這樣的對(duì)象直接給servlet開(kāi)發(fā)人員存在一個(gè)安全隱患展东,servlet開(kāi)發(fā)人員可以將request,和response對(duì)象做向上轉(zhuǎn)型之后調(diào)用它們自己的公共方法炒俱,但這些方法在servlet中應(yīng)該是不可用的盐肃! how to awoid this problem?
it's very easy:
我們利用組合的方式分別建立request和response的外觀類(lèi)
它們的結(jié)構(gòu)大致如下
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接口里的眾多方法
}
然后通過(guò)request和response初始它們的外觀類(lèi)對(duì)象,并把它們的外觀類(lèi)對(duì)象傳給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 外觀類(lèi)包含類(lèi)request权悟,并且和request類(lèi)都繼承了ServletRequest接口砸王,所以servlet程序員就可以通過(guò)外觀類(lèi)來(lái)調(diào)用ServletRequest接口的所有方法,同時(shí)有效屏蔽了request類(lèi)自己的公共方法峦阁。ResponseFacade具有同樣的功能谦铃。