文章目录
- 前言
- 一、类适配器模式
- 完整代码
- 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 {
@Override
public int output5V() {
//获取到 220V 电压
int srcV = output220V();
int dstV = srcV / 44 ; //转成 5v
return 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;
}
@Override
public 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{
//默认实现,不写方法体
@Override
public void m1() {
}
@Override
public void m2() {
}
@Override
public void m3() {
}
@Override
public void m4() {
}
}
客户端测试
package tanchishell.SJMS.classadapter2;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
//只需要去覆盖我们 需要使用 接口方法
@Override
public 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的对象,
// 适配器可以获取到希望的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) {
//遍历:根据得到的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方法。
*/
}