目录
一:类适配器
理论: Adapter类 通过继承src类,实现dst类接口(重新接口的方法实现适配) 完成src->dst的适配,也不再要求dst是接口
缺点: 有继承关系 且dst必须是接口
/** * 提供5V电压接口 */ public interface Voltage5V { public int output5V(); }
/** * 提供220V电压 */ public class Voltage220V { public int output220V() { int src = 220; System.out.println("电压=" + src + "V"); return src; } }
/** * 适配器类 继承220V获取原有数据 实现目标接口输出5V */ public class VoltageAdapter extends Voltage220V implements Voltage5V{ @Override public int output5V() { // 获取原来的220V电压 int src = output220V(); int dst = src/4; return dst; } }
public class Phone { // 充电方法 public void charging() { VoltageAdapter voltageAdapter = new VoltageAdapter(); System.out.println(voltageAdapter.output5V()); } public static void main(String[] args) { Phone phone = new Phone(); // 转换电压 phone.charging(); } }
二:对象适配器
目的:通过组合方式传递依赖(直接注入/通过set方式/通过构造器),不继承类,只实现接口
/** * 提供5V电压 */ public interface Voltage5V { public int output5V(); }
/** * 提供220V电压 */ public class Voltage220V { public int output220V() { int src = 220; System.out.println("电压=" + src + "V"); return src; } }
/** * 适配器类 继承220V获取原有数据 实现目标接口输出5V */ public class VoltageAdapter implements Voltage5V { @Autowired private Voltage220V voltage220V; @Override public int output5V() { // 获取原来的220V电压 int src = voltage220V.output220V(); int dst = src/4; return dst; } }
三:接口适配器模式(缺省适配器模式)
理论:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择的覆盖父类的某些方法来实现需求
适用:适用于一个接口不想使用期所有的方法的情况
/** * 抽象接口 */ public interface Interface4 { public void m1(); public void m2(); public void m3(); public void m4(); }
/** * 在该适配器中实现默认空实现 */ public abstract class AbsAdapter implements Interface4{ @Override public void m1() {} @Override public void m2() {} @Override public void m3() {} @Override public void m4() {} }
public class Client { public static void main(String[] args) { // 重新自己需要的类 AbsAdapter adapter = new AbsAdapter(){ @Override public void m1() { System.out.println("使用m1方法..."); } }; adapter.m1(); } }
四:案例
// 多种controller的实现 public interface Controller { } class HttpController implements Controller { public void doHttpHandler() { System.out.println("http..."); } } class SimpleController implements Controller { public void doSimpleHandler() { System.out.println("Simple..."); } } class AnnotationController implements Controller { public void doAnnotationHandler() { System.out.println("Annotation..."); } }
// 定义一个Adapter接口 public interface HandlerAdapter { public boolean supports(Object handler); public void handle(Object handler); } // 多种适配器类 class AnnotationHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof AnnotationController); } @Override public void handle(Object handler) { ((AnnotationController)handler).doAnnotationHandler(); } } class SimpleHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof SimpleController); } @Override public void handle(Object handler) { ((SimpleController)handler).doSimpleHandler(); } } class HttpHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof HttpController); } @Override public void handle(Object handler) { ((HttpController)handler).doHttpHandler(); } }
public class DispatchServlet { public static List<HandlerAdapter> handlerAdapters = new ArrayList<>(); public DispatchServlet() { handlerAdapters.add(new AnnotationHandlerAdapter()); handlerAdapters.add(new HttpHandlerAdapter()); handlerAdapters.add(new SimpleHandlerAdapter()); } public void doDispatch() { // 此处模拟SpringMVC从request取handler对象 // 适配器可以获取到希望的Controller HttpController httpController = new HttpController(); HandlerAdapter handler = getHandler(httpController); handler.handle(httpController); } public HandlerAdapter getHandler(Controller controller) { for (HandlerAdapter adapter : handlerAdapters) { if (adapter.supports(controller)) { return adapter; } } return null; } public static void main(String[] args) { new DispatchServlet().doDispatch();// 输出 http... } }