> 文章列表 > 第八章 适配器模式

第八章 适配器模式

第八章 适配器模式


文章目录

  • 前言
  • 一、类适配器模式
    • 完整代码
    • 220V 被适配类 Voltage220V
    • 5V 适配接口 IVoltage5V
    • 适配器类转换电压 VoltageAdapter 继承220V实现5V接口
    • 手机类判断是否能充电 Phone
    • 客户端调试
    • 类适配器模式注意事项和细节
  • 二、对象适配器模式
    • 完整代码
    • 220V 被适配类 Voltage220V
    • 5V 适配接口 IVoltage5V
    • 适配器类转换电压 VoltageAdapter 聚合 220V实现5V接口
    • 手机类判断是否能充电 Phone
    • 客户端调试
    • 对象适配器模式注意事项和细节
  • 三、接口适配器模式
    • 完整代码
    • 接口
    • 抽象类
    • 客户端测试
  • 四、适配器模式在SpringMVC框架应用的源码分析
    • 模拟SpringMVC 的 DispatchServlet 的执行流程,使用适配器模式
    • 完整代码
    • 适配器接口与被适配类(适配器角色与 被适配角色)
    • 多种Controller实现, 目标角色
    • DispatchServlet
  • 五、适配器模式的注意事项和细节

前言

第八章 适配器模式

第八章 适配器模式
第八章 适配器模式


一、类适配器模式

第八章 适配器模式

第八章 适配器模式
第八章 适配器模式

完整代码

220V 被适配类 Voltage220V

package tanchishell.SJMS.classadapter;//被适配的类
public class Voltage220V {//输出 220V 的电压public int output220V() {int src = 220;System.out.println("电压=" + src + "伏");return src;}
}

5V 适配接口 IVoltage5V

package tanchishell.SJMS.classadapter;//适配接口
public interface IVoltage5V {public int output5V();
}

适配器类转换电压 VoltageAdapter 继承220V实现5V接口

package tanchishell.SJMS.classadapter;//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {@Overridepublic int output5V() {//获取到 220V 电压int srcV = output220V();int dstV = srcV / 44 ; //转成 5vreturn dstV;}
}

手机类判断是否能充电 Phone

package tanchishell.SJMS.classadapter;public class Phone {//充电public void charging(IVoltage5V iVoltage5V) {if(iVoltage5V.output5V() == 5) {System.out.println("电压为 5V, 可以充电~~");} else if (iVoltage5V.output5V() > 5) {System.out.println("电压大于 5V, 不能充电~~");}}
}

客户端调试

package tanchishell.SJMS.classadapter;public class Client {public static void main(String[] args) {System.out.println(" === 类适配器模式 ====");Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}输出=== 类适配器模式 ====
电压=220伏
电压为 5V, 可以充电~~

类适配器模式注意事项和细节

第八章 适配器模式

二、对象适配器模式

第八章 适配器模式
第八章 适配器模式
第八章 适配器模式
第八章 适配器模式

完整代码

220V 被适配类 Voltage220V

package tanchishell.SJMS.classadapter;//被适配的类
public class Voltage220V {//输出 220V 的电压public int output220V() {int src = 220;System.out.println("电压=" + src + "伏");return src;}
}

5V 适配接口 IVoltage5V

package tanchishell.SJMS.classadapter;//适配接口
public interface IVoltage5V {public int output5V();
}

适配器类转换电压 VoltageAdapter 聚合 220V实现5V接口

package tanchishell.SJMS.classadapter;//适配器类
public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V; // 关联关系-聚合//通过构造器,传入一个 Voltage220V 实例public VoltageAdapter(Voltage220V voltage220v) {this.voltage220V = voltage220v;}@Overridepublic int output5V() {int dst = 0;if(null != voltage220V) {int src = voltage220V.output220V();//获取 220V 电压System.out.println("使用对象适配器,进行适配~~");dst = src / 44;System.out.println("适配完成,输出的电压为=" + dst);}return dst;}
}

手机类判断是否能充电 Phone

package tanchishell.SJMS.classadapter;public class Phone {//充电public void charging(IVoltage5V iVoltage5V) {if(iVoltage5V.output5V() == 5) {System.out.println("电压为 5V, 可以充电~~");} else if (iVoltage5V.output5V() > 5) {System.out.println("电压大于 5V, 不能充电~~");}}
}

客户端调试

package tanchishell.SJMS.classadapter;public class Client {public static void main(String[] args) {System.out.println(" === 对象适配器模式 ====");Phone phone = new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}输出=== 对象适配器模式 ====
电压=220伏
使用对象适配器,进行适配~~
适配完成,输出的电压为=5
电压为 5V, 可以充电~~

对象适配器模式注意事项和细节

第八章 适配器模式

三、接口适配器模式

让一个抽象类去实现所有需要的接口,但只实现,不写方法内容,最后需要哪些接口的功能,重写抽象类对应的方法就可以

第八章 适配器模式
第八章 适配器模式

第八章 适配器模式
第八章 适配器模式

完整代码

接口

package tanchishell.SJMS.classadapter2;public interface Interface4 {public void m1();public void m2();public void m3();public void m4();
}

抽象类

package tanchishell.SJMS.classadapter2;public class AbsAdapter implements Interface4{//默认实现,不写方法体@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}
}

客户端测试

package tanchishell.SJMS.classadapter2;public class Client {public static void main(String[] args) {AbsAdapter absAdapter = new AbsAdapter() {//只需要去覆盖我们 需要使用 接口方法@Overridepublic void m1() {System.out.println("使用了 m1 的方法");}};absAdapter.m1();}
}输出使用了 m1 的方法

四、适配器模式在SpringMVC框架应用的源码分析

第八章 适配器模式
第八章 适配器模式
第八章 适配器模式

模拟SpringMVC 的 DispatchServlet 的执行流程,使用适配器模式

第八章 适配器模式

完整代码

/
* 思路分析:
* 目标角色 Controller 有着多种实现子类,一一对应对应着 适配器角色 HandlerAdapter的实现子类,被适配角色。
* 当 DispatchServlet.doDispatch()方法被调用时,会先获取一个 目标角色的实现子类 比如 HttpController,
* 这时 调用getController 方法, 去匹配对应的适配器(适配器角色的实现子类被适配角色),当匹配到了对应的适配器,
* 将适配器进行返回,获取到适配器后 调用 handle 方法传入一个Controller,
* 对应的适配器会将传入的Controller进行对应的强制类型转换,再执行适配器里面的 doHttpHandler方法。
*/

适配器接口与被适配类(适配器角色与 被适配角色)

package tanchishell.springMVC;///定义一个Adapter接口 适配器角色
public interface HandlerAdapter {public boolean supports(Object handler);public void handle(Object handler);
}// 多种适配器类  被适配角色class SimpleHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((SimpleController) handler).doSimplerHandler();}public boolean supports(Object handler) {return (handler instanceof SimpleController);}}class HttpHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((HttpController) handler).doHttpHandler();}public boolean supports(Object handler) {return (handler instanceof HttpController);}}class AnnotationHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((AnnotationController) handler).doAnnotationHandler();}public boolean supports(Object handler) {return (handler instanceof AnnotationController);}}

多种Controller实现, 目标角色

package tanchishell.springMVC;//多种Controller实现, 目标角色
public interface Controller {}class HttpController implements Controller {public void doHttpHandler() {System.out.println("http...");}
}class SimpleController implements Controller {public void doSimplerHandler() {System.out.println("simple...");}
}class AnnotationController implements Controller {public void doAnnotationHandler() {System.out.println("annotation...");}
}

DispatchServlet

package tanchishell.springMVC;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的对象,// 适配器可以获取到希望的ControllerHttpController controller = new HttpController();// AnnotationController controller = new AnnotationController();//SimpleController controller = new SimpleController();// 得到对应适配器HandlerAdapter adapter = getHandler(controller);// 通过适配器执行对应的controller对应方法adapter.handle(controller);}public HandlerAdapter getHandler(Controller controller) {//遍历:根据得到的controller(handler), 返回对应适配器for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(controller)) {return adapter;}}return null;}public static void main(String[] args) {new DispatchServlet().doDispatch(); // http...}/*  思路分析:*      目标角色 Controller 有着多种实现子类,一一对应对应着 适配器角色 HandlerAdapter的实现子类,被适配角色。*      当 DispatchServlet.doDispatch()方法被调用时,会先获取一个 目标角色的实现子类 比如 HttpController,*      这时 调用getController 方法, 去匹配对应的适配器(适配器角色的实现子类被适配角色),当匹配到了对应的适配器,*      将适配器进行返回,获取到适配器后 调用 handle 方法传入一个Controller,*      对应的适配器会将传入的Controller进行对应的强制类型转换,再执行适配器里面的 doHttpHandler方法。*/}

五、适配器模式的注意事项和细节

第八章 适配器模式