第八章 适配器模式
文章目录
- 前言
- 一、类适配器模式
-
- 完整代码
- 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方法。*/}