Facade(外觀)模式

Facade(外觀)模式為子系統(tǒng)中的各類(或結(jié)構(gòu)與方法)提供一個簡明一致的界面,隱藏子系統(tǒng)的復(fù)雜性,使子系統(tǒng)更加容易使用。它是為子系統(tǒng)中的一組接口所提供的一個一致的界面
應(yīng)用:重新進行類的設(shè)計,將原來分散在源碼中的類/結(jié)構(gòu)及方法重新組合,形成新的、統(tǒng)一的接口,供上層應(yīng)用使用。

聽起來有點高端,其實很簡單,用一個簡單的例子說明下

在寫一個簡單的tomcat容器時,需要在一個處理器類ServletProcessor里面把request,response這兩個對象傳遞給Servlet類的service(request, response)方法供servlet開發(fā)人員使用:

((Servlet)ServletClass.newInstance()).service(request, response);

這里的傳遞的request和response對象由tomcat開發(fā)人員創(chuàng)建,除了實現(xiàn)繼承自javax.sevrlet.request接口和javax.servlet.response接口的方法外它們還有各自的公共方法,
把這樣的對象直接給servlet開發(fā)人員存在一個安全隱患,servlet開發(fā)人員可以將request,和response對象做向上轉(zhuǎn)型之后調(diào)用它們自己的公共方法,但這些方法在servlet中應(yīng)該是不可用的! how to awoid this problem?

it's very easy:

我們利用組合的方式分別建立request和response的外觀類
它們的結(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接口里的眾多方法
}

然后通過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程序員就可以通過外觀類來調(diào)用ServletRequest接口的所有方法,同時有效屏蔽了request類自己的公共方法。ResponseFacade具有同樣的功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,688評論 18 399
  • Servlet Interface 是Java Servlet API的核心抽象。所有的servlets都直接或者...
    Lucky_Micky閱讀 1,878評論 2 2
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,798評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 本文包括:1、Listener簡介2、Servlet監(jiān)聽器3、監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4、監(jiān)聽三個域?qū)?..
    廖少少閱讀 6,648評論 6 28

友情鏈接更多精彩內(nèi)容