营销网站建设文章wordpress怎么访问404地址
营销网站建设文章,wordpress怎么访问404地址,如何做学校的网站,互联网博客网站适配器模式介绍
适配器模式#xff08;Adapter Pattern#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式#xff0c;它结合了两个独立接口的功能。
应用场景#xff1a; 1、系统需要使用现有的类#xff0c;而此类的接口不符合系统的需要…适配器模式介绍
适配器模式Adapter Pattern是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式它结合了两个独立接口的功能。
应用场景 1、系统需要使用现有的类而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类用于与一些彼此之间没有太大关联的一些类包括一些可能在将来引进的类一起工作这些源类不一定有一致的接口。 3、通过接口转换将一个类插入另一个类系中。比如老虎和飞禽现在多了一个飞虎在不增加实体的需求下增加一个适配器在里面包容一个虎对象实现飞的接口。
优点 促进代码重用通过适配器原本不兼容的接口可以协同工作提高了现有代码的重用性。 提高透明性客户端代码通过适配器与目标接口交互而不需要直接依赖原有接口这样即便接口发生变化客户端代码也无需改动。 灵活性在系统引入新技术或者第三方库时可以通过适配器模式将其融入现有系统中而不影响其他部分的代码。 缺点 系统复杂性增加引入适配器模式会增加系统中的类的数量有时候可能会使得系统结构变得复杂。 过多使用可能导致混乱如果在一个系统中大量使用适配器模式可能会引起接口和实现的混乱从而降低代码的可读性和可维护性。 性能开销每次调用都需要通过适配器进行转换这可能会带来一定的性能开销尤其是在高性能要求的系统中需要特别注意。
源码中应用
Spring MVC中广泛使用了适配器模式它用于将不同类型的Controller适配到统一的请求处理流程中。
在Spring MVC框架中DispatcherServlet作为中心调度器负责处理所有的HTTP请求但它并不直接执行请求处理方法这项工作由HandlerAdapter来完成。HandlerAdapter在这里起到了适配器的作用它将Controller需要适配的类适配到统一的接口上以便DispatcherServlet可以透明地调用任何类型的Controller处理方法。
以下是适配器模式在Spring MVC中的应用细节
定义适配器接口定义一个HandlerAdapter接口包含两个主要方法——supports()用来判断适配器是否支持对应的Controllerhandle()用来执行Controller中的处理方法。
public interface HandlerAdapter {/***给定一个处理程序实例返回此code HandlerAdapter*可以支持它。典型的HandlerAdapters将根据处理程序做出决定类型HandlerAdapters通常每个只支持一种处理程序类型。*/boolean supports(Object handler);/***使用给定的处理程序来处理此请求。*/NullableModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;/***与HttpServlet的code getLastModified方法的合约相同。*/Deprecatedlong getLastModified(HttpServletRequest request, Object handler);}实现适配器对于每种类型的Controller提供相应的HandlerAdapter实现类。例如HttpRequestHandlerAdapter用于适配HttpRequestHandler类型的处理器。
public class HttpRequestHandlerAdapter implements HandlerAdapter {Overridepublic boolean supports(Object handler) {return (handler instanceof HttpRequestHandler);}OverrideNullablepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {((HttpRequestHandler) handler).handleRequest(request, response);return null;}OverrideSuppressWarnings(deprecation)public long getLastModified(HttpServletRequest request, Object handler) {if (handler instanceof LastModified) {return ((LastModified) handler).getLastModified(request);}return -1L;}}存放适配器实例Spring容器启动时会将所有定义好的HandlerAdapter实现类实例存放在一个List集合中供DispatcherServlet使用。
private void initHandlerAdapters(ApplicationContext context) {this.handlerAdapters null;if (this.detectAllHandlerAdapters) {// 在ApplicationContext中查找所有HandlerAdapterMapString, HandlerAdapter matchingBeans BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);if (!matchingBeans.isEmpty()) {this.handlerAdapters new ArrayList(matchingBeans.values());// 排序HandlerAdapters AnnotationAwareOrderComparator.sort(this.handlerAdapters);}}else {try {HandlerAdapter ha context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);this.handlerAdapters Collections.singletonList(ha);}catch (NoSuchBeanDefinitionException ex) {// 不处理并添加默认的HandlerAdapters }}// 通过注册确保至少有一个HandlerAdapterif (this.handlerAdapters null) {this.handlerAdapters getDefaultStrategies(context, HandlerAdapter.class);if (logger.isTraceEnabled()) {logger.trace(No HandlerAdapters declared for servlet getServletName() : using default strategies from DispatcherServlet.properties);}}}选择适配器当请求到达时DispatcherServlet会根据Handler的类型找到对应的HandlerAdapter。这个过程通常通过遍历HandlerAdapter列表并使用supports()方法来确定。
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {if (this.handlerAdapters ! null) {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}}throw new ServletException(No adapter for handler [ handler ]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler);}处理请求一旦找到了合适的HandlerAdapter就会调用其handle()方法来执行Controller中的请求处理方法并返回ModelAndView对象。
总的来说适配器模式在Spring MVC中起到了至关重要的作用它使得框架能够灵活地处理各种类型的Controller而无需修改DispatcherServlet的内部逻辑。这种设计提高了代码的可复用性和扩展性同时遵循了设计模式中的开闭原则——对扩展开放对修改关闭。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90999.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!