概念:
是指将一个类的接口配置成用户所期待的。这样的做法通常是自己类的接口包裹在一个已存在类中, 使得原本因为接口不兼容而不能在一起工作的两个类在一起工作。
使用前提:
接口中包含了所有要实现的方法;
但要实现此接口的具体类,只用到了其中几个方法,而且方法都是没有用的。
实现方法:
用一个抽象类实现已有接口,并实现接口中的所有方法,这些方法都可以是平庸实现的;但在此类中,方法都是具体的方法,而不是抽象方法,否则的话,在具体子类中依然要进行实现,这就失去了适配的本来作用。
原本来实现接口的子类,继承上面的抽象类,并只重写其中它感兴趣的方法。
注意事项:
充当适配器角色的类,就是实现接口的抽象类。
示例:
接口:
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;
}
}