Java描述设计模式(07):适配器模式
本文源码:
GitHub·点这里 ||
GitEE·点这里
一、适配器模式简介1、基础概念
2、生活场景基于适配器模式,把220V的电压,转换为需要的110V电压。 public class C01_InScene { public static void main(String[] args) { CurrentAdapter adapter = new CurrentAdapter() ; System.out.println(adapter.get110VCurrent()) ; } } // 220V电流 class Current220V { public int get220VCurrent (){ return 220 ; } } // 110V电流接口 interface Current110V { int get110VCurrent () ; } // 电流适配器 class CurrentAdapter extends Current220V implements Current110V { // 电流转换方法 @Override public int get110VCurrent() { int high = get220VCurrent() ; int low = high/2 ; return low ; } } 二、类适配器1、模式简介类的适配器模式把适配的类的API转换成为目标类的API。 2、核心角色
这就是所期待得到的接口。
现在需要适配的接口。
适配器类是本模式的核心。适配器把源接口转换成目标接口。 3、源码实现interface Target { void sampleOperation1(); void sampleOperation2(); } class Adaptee { public void sampleOperation1(){ System.out.println("Adaptee.sampleOperation1()"); } } class Adapter extends Adaptee implements Target{ @Override public void sampleOperation2() { System.out.println("Adapter.sampleOperation2()"); } } 三、对象适配器1、模式简介
2、源码实现interface Target1 { void sampleOperation1(); void sampleOperation2(); } class Adaptee1 { public void sampleOperation1(){ System.out.println("Adaptee.sampleOperation1()"); } } class Adapter1 implements Target1 { private Adaptee1 adaptee ; public Adapter1 (Adaptee1 adaptee){ this.adaptee = adaptee; } public void sampleOperation1() { this.adaptee.sampleOperation1(); } @Override public void sampleOperation2() { System.out.println("Adapter.sampleOperation2()"); } } 四、接口适配器1、模式简介缺省(接口)适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。 2、源代码实现public class C04_AdapterInte { public static void main(String[] args) { ServiceAdapter adapter = new ServiceAdapter(){ @Override public int serviceOperation2() { return 22 ; } }; System.out.println(adapter.serviceOperation2()); } } interface AbstractService { void serviceOperation1(); int serviceOperation2(); String serviceOperation3(); } class ServiceAdapter implements AbstractService{ @Override public void serviceOperation1() { } @Override public int serviceOperation2() { return 0; } @Override public String serviceOperation3() { return null; } } 五、Spring框架应用1、应用场景描述在SpringMvc执行控制执行请求的时候,有这样一个流程 1)前段控制器DispatcherServlet调用处理器适配器去执行Handler(也就是Controller); 2、流程分析
Controller和HandlerAdapter两核心接口。
适配器接口,使Handler有对应的适配器实现类,适配器代替Handler(控制层Controller)执行相应的方法。 public interface HandlerAdapter { // 判断类型是否匹配 boolean supports(Object var1); // 执行方法,返回ModelAndView ModelAndView handle(HttpServletRequest var1,HttpServletResponse var2,Object var3) throws Exception; } supports()方法传入处理器,判断适配器是否支持,如果支持则返回支持的适配器实现类。
抽取源码中体现流程的几个步骤。 protected void doDispatch(HttpServletRequest request,HttpServletResponse response) throws Exception { HandlerExecutionChain mappedHandler = null; mappedHandler = this.getHandler(processedRequest); HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler()); mv = ha.handle(processedRequest,response,mappedHandler.getHandler()); mappedHandler.applyPostHandle(processedRequest,mv); }
最后看下supports和handle两个方法的具体实现。 public class SimpleControllerHandlerAdapter implements HandlerAdapter { public SimpleControllerHandlerAdapter() { } public boolean supports(Object handler) { return handler instanceof Controller; } public ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception { return ((Controller)handler).handleRequest(request,response); } } 六、适配器优缺点1、优点分析
2、缺点分析
七、源代码地址GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |