Facade(外观)模式

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具有同样的功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,835评论 18 399
  • Servlet Interface 是Java Servlet API的核心抽象。所有的servlets都直接或者...
    Lucky_Micky阅读 1,756评论 2 2
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,417评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,246评论 19 139
  • 本文包括:1、Listener简介2、Servlet监听器3、监听三个域对象创建和销毁的事件监听器4、监听三个域对...
    廖少少阅读 6,223评论 6 28