我们可以使用上下文对象以独立于协议的方式封装状态,以便在整个应用程序中共享。在上下文对象中封装系统数据的上下文对象模式允许它与应用程序的其他部分共享,而无需将应用程序耦合到特定的协议。
例如,HTML表单的每个字段都存在一个HTTP请求参数,上下文对象可以以独立于协议的方式存储这些数据,同时促进其转换和验证。然后应用程序的其他部分只访问上下文对象中的信息,而无需了解HTTP协议。协议中的任何更改都由上下文对象处理,而应用程序的任何其他部分都不需要更改。上下文对象的主要目标是以独立于协议的方式共享系统信息,从而提高应用程序的可重用性和可维护性。
下面的上下文对象是这个模式的示例
让我们看看这种模式如何以独立于协议的方式共享系统信息,从而提高应用程序的可重用性和可维护性。
为简单起见,这种模式分为若干部分,如问题,力量,解决方案,结构,实现,适用性等。
(问题部分描述了开发人员面临的设计问题)
类图
序列图
一个客户端 使用 ContextFactory 创建 ContextObject 使用 ProtocolInterface。ContextObject将周围的应用程序组件和服务与ProtocolInterface的底层细节隔离开来。
实现 上下文对象 有很多策略,这些策略是根据正在创建的上下文对象 的类型进行分组的。当 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); } ...}
在分层体系结构中,如果我们想要跨不同的系统层共享系统信息,就使用此设计模式。