前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的上下文对象设计模式

Java中的上下文对象设计模式

作者头像
lyb-geek
发布2019-05-07 14:54:09
3K0
发布2019-05-07 14:54:09
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

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

例如,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 中实现,然后被传递。

代码语言:javascript
复制
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);        }        ...}

适用性

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 现实世界的例子
  • 目录
    • 问题
      • 核心
        • 解决方案
          • 结构
            • 参与者和责任
              • 执行
                • 适用性
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档