美文网首页IT干货
Facade(外观)模式

Facade(外观)模式

作者: FANERARTIST | 来源:发表于2016-10-10 14:13 被阅读110次

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

相关文章

  • Android 设计模式入门到精通之十:外观模式(Facade

    外观模式(Facade Pattern,门面模式) 1. 概念 Facade Pattern: Provide a...

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 外观模式(Facade)

    定义外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一...

  • 外观模式-facade

    为子系统中的一组接口提供一个一致的界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 代...

  • 外观模式(Facade)

    1、概念 外观模式是外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,...

  • 外观模式(Facade)

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口是的这一子系统...

  • 外观模式(Facade)

    为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 类型 结...

  • 外观模式-Facade

    外观模式是为了解决类与类之间依赖关系的,外观模式将类间关系放在一个Facade类中,降低了类类之间的耦合度,该模式...

  • 外观模式(Facade)

    文章转自iOS设计模式:外观模式 基本概念 外观模式:为子系统的一组接口提供一个一致的界面,此模式定义一个高层接口...

  • 外观模式(facade)

    facade模式是为了简化操作,使用组合的方式提供一个统一的入口,而隐藏细节。 一般程序设计中很少使用外观模式,只...

网友评论

    本文标题:Facade(外观)模式

    本文链接:https://www.haomeiwen.com/subject/mngmyttx.html