适配器模式

本文介绍了适配器模式的概念及其实现方法,通过一个具体的示例详细解释了如何使用抽象类来实现接口,并展示了如何通过继承适配器类来重写特定的方法。

概念:

是指将一个类的接口配置成用户所期待的。这样的做法通常是自己类的接口包裹在一个已存在类中, 使得原本因为接口不兼容而不能在一起工作的两个类在一起工作。

 

使用前提:

         接口中包含了所有要实现的方法;

         但要实现此接口的具体类,只用到了其中几个方法,而且方法都是没有用的。

 

实现方法:

         用一个抽象类实现已有接口,并实现接口中的所有方法,这些方法都可以是平庸实现的;但在此类中,方法都是具体的方法,而不是抽象方法,否则的话,在具体子类中依然要进行实现,这就失去了适配的本来作用。

         原本来实现接口的子类,继承上面的抽象类,并只重写其中它感兴趣的方法。

 

注意事项:

         充当适配器角色的类,就是实现接口的抽象类。

        

示例:

接口:

public interface HandlerInterceptor {

 

       boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

           throws Exception;

 

       void postHandle(

                     HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

                     throws Exception;

 

       void afterCompletion(

                     HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

                     throws Exception;

 

}

 

适配器(抽象类):

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {

       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

           throws Exception {

              return true;

       }

       public void postHandle(

                     HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

                     throws Exception {

       }

 

       public void afterCompletion(

                     HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

                     throws Exception {

       }

}

 

实现类:

 

public class LocaleChangeInterceptor extends HandlerInterceptorAdapter {

 

       public static final String DEFAULT_PARAM_NAME = "locale";

 

       private String paramName = DEFAULT_PARAM_NAME;

 

       public void setParamName(String paramName) {

              this.paramName = paramName;

       }

 

       public String getParamName() {

              return this.paramName;

       }

 

 

       @Override

       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

                     throws ServletException {

 

              String newLocale = request.getParameter(this.paramName);

              if (newLocale != null) {

                     LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);

                     if (localeResolver == null) {

                            throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");

                     }

                     localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));

              }

              // Proceed in any case.

              return true;

       }

 

}

 


转载于:https://my.oschina.net/paper0519/blog/209128

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值