adapter
适配器模式
就是你有一个类接口,但是这个接口不太符合你的预期,如果要用他就需要在他的源码上进行一些修改,这时你可以做一个适配器,在不修改原来这个接口源码的情况下,在适配器上对这个接口进行运用,使得适配器符合你的规范。
适配器模式(Adapter Pattern),把一个类的接口变换成客户端所期待的另一种接口, Adapter模式使原本因接口不匹配(或者不兼容)而无法在一起工作的两个类能够在一起工作。又称为转换器模式、变压器模式、包装(WrAPPer)器模式(把已有的一些类包装起来,使之能有满足需要的接口)。
例如内存卡-读卡器-笔记本,内存卡就是这个类接口,读卡器就是适配器,笔记本是系统,笔记本通过读卡器使用内存卡。
实现方式:
1.适配器与被适配接口是继承关系
2.适配器内组合被适配接口
以下情况可以使用适配器模式:
1 你想使用一个已经存在的类,而它的接口不符合你的需求。
2 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3 (仅适用于组合方式)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。即仅仅引入一个对象,并不需要额外的指针以间接取得被适配接口。
最后有个例子
SpringMVC适配器handlerAdapter
springmvc的handler(controller,HttprequestHandler,Servlet等)有多种实现方式,例如继承Controller的,基于注解控制器方式的,HttpRequestHandler方式的。由于实现方式不一样,调用方式就不确定了。
如果正常编写调用,就需要使用多个if else判断instance of,再添加实现方式,就需要修改源码,不符合对扩展开放,对修改关闭原则。
看HandlerAdapter接口有三个方法:
boolean supports(Object handler);
modelandview handle(HttpServletRequest request, HttpServletresponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
第一个方法是判断该适配器是否支持这个HandlerMethod,就是当得到一个handler时,该接口子类该方法做判断(就是类似handler instanceof Controller的判断方式),用来得到适配这个handler的适配器子类。
第二个方法用来执行控制器处理函数,获取ModelAndView 。就是根据该适配器调用规则执行handler方法。
HandlerAdapter使用过程:
DispatcherServlet中的doService方法经过数据灌入后调用doDispatch方法;
doDispatch会先利用HandlerMapping得到想要的HandlerexecutionChain(里面包含handler和一堆拦截器),即得到controller;
然后利用handler,getHandlerAdapter(mappedHandler.getHandler())得到HandlerAdapter,这个函数会遍历所有注入的HandlerAdapter,依次使用supports方法寻找适合这个handler的适配器子类。
最后通过这个获取的适配器子类运用ha.handle(processedRequest, response, mappedHandler.getHandler());方法调用控制器函数,返回ModelAndView
继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter
HTTP请求处理器适配器:HttpRequestHandlerAdapter
注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter
下面是网上看到的一套模拟springmvc适配器的代码:
//定义一个Adapter接口
public interface HandlerAdapter {
public boolean supports(Object handler);
public void handle(Object handler);
}
//以下是三种Controller实现
public interface Controller {
}
public class HttpController implements Controller{
public void doHttpHandler(){
System.out.println("http...");
}
}
public class SimpleController implements Controller{
public void doSimplerHandler(){
System.out.println("simple...");
}
}
public class AnnotationController implements Controller{
public void doAnnotationHandler(){
System.out.println("annotation...");
}
}
//下面编写适配器类
public class SimpleHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((SimpleController)handler).doSimplerHandler();
}
public boolean supports(Object handler) {
return (handler instanceof SimpleController);
}
}
public class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
public class AnnotationHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
}
//模拟一个DispatcherServlet
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet {
public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
public DispatchServlet(){
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch(){
//此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
//不论实现何种Controller,适配器总能经过适配以后得到想要的结果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller = new SimpleController();
//得到对应适配器
HandlerAdapter adapter = getHandler(controller);
//通过适配器执行对应的controller对应方法
adapter.handle(controller);
}
public HandlerAdapter getHandler(Controller controller){
for(HandlerAdapter adapter: this.handlerAdapters){
if(adapter.supports(controller)){
return adapter;
}
}
return null;
}
public static void main(String[] args){
new DispatchServlet().doDispatch();
}
}
相关阅读
Spring整合HIbernate和springmvc 1.导入jar包 <properties> <org.springframework.version>4.2.0.RELEASE</org.springfram