Java中的上下文对象设计模式(Context Object Design Pattern)

19-03-29 jdon
         

我们可以使用上下文对象以独立于协议的方式封装状态,以便在整个应用程序中共享。在上下文对象中封装系统数据的上下文对象模式允许它与应用程序的其他部分共享,而无需将应用程序耦合到特定的协议。

例如,HTML表单的每个字段都存在一个HTTP请求参数,上下文对象可以以独立于协议的方式存储这些数据,同时促进其转换和验证。然后应用程序的其他部分只访问上下文对象中的信息,而无需了解HTTP协议。协议中的任何更改都由上下文对象处理,而应用程序的任何其他部分都不需要更改。上下文对象的主要目标是以独立于协议的方式共享系统信息,从而提高应用程序的可重用性和可维护性。

现实世界的例子

下面的上下文对象是这个模式的示例

ApplicationContext是Spring应用程序 中的中央接口,用于向应用程序提供配置信息。

SecurityContext  用于存储当前已验证用户的详细信息,并可通过该应用程序进一步访问。

ServletContext 用于与所有servlet共享配置信息。

让我们看看这种模式如何以独立于协议的方式共享系统信息,从而提高应用程序的可重用性和可维护性。

为简单起见,这种模式分为若干部分,如问题,力量,解决方案,结构,实现,适用性等。

目录

  1. 问题
  2. 核心
  3. 解决方案
  4. 说明
  5. 结构 - 类图,序列图
  6. 参与者和责任
  7. 执行
  8. 结果
  9. 适用性

问题

(问题部分描述了开发人员面临的设计问题)

您希望避免在其相关上下文之外使用特定于协议的系统信息。

核心

您有需要访问系统信息的组件和服务。

您希望将应用程序组件和服务与系统信息的协议细节分离。

您希望仅在上下文中公开相关的API。

解决方案

使用上下文对象以独立于协议的方式封装状态,以便在整个应用程序中共享。

结构

类图

序列图

参与者和责任

一个  客户端  使用  ContextFactory  创建  ContextObject  使用  ProtocolInterface。ContextObject将周围的应用程序组件和服务与ProtocolInterface的底层细节隔离开来。

客户端:  创建一个具有协议接口的对象。

ProtocolInterface:  公开协议或特定于层的详细信息的对象。

ContextFactory:  ContextFactory创建协议和层独立

ContextObject:  ContextObject是一个通用对象,用于在整个应用程序中共享域中立状态。

执行

实现 上下文对象 有很多策略,这些策略是根据正在创建的上下文对象 的类型进行分组的。当  ContextObject  封装请求状态时,它也称为  RequestContext 。

在下面的示例中,HttpServletRequest  是特定于协议的Request对象,应该在应用程序中有所体现。

该  ContextFactory  创建的RequestContext (ContextObject) 并从 HttpServletRequest将状态传递给它。RequestContext中的数据通常在此时进行初始的表单级验证,例如,检查空字段或检查具有正确位数的信用卡号。

在执行业务处理时, ContextObject状态通常会经历与业务相关的第二轮验证,例如值是否在适当的范围内。相关的请求状态被转移到标准的  Map  中实现,然后被传递。

public class FrontController extends HttpServlet {
    ...
    private void processRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
        java.io.IOException {

            // create RequestContext object using Map Strategy
            Map requestContextMap = new HashMap(request.getParameterMap());
            Dispatcher dispatcher = new Dispatcher(request, response);
            requestContextMap.put("dispatcher", dispatcher);

            // Create ApplicationController instance
            ApplicationController applicationController =
                new ApplicationControllerImpl();

            // Request processing
            ResponseContext responseContext =
                applicationController.handleRequest(requestContextMap);

            // Response processing
            applicationController.handleResponse(requestContextMap,
                responseContext);
        }
        ...
}

适用性

在分层体系结构中,如果我们想要跨不同的系统层共享系统信息,就使用此设计模式。