Adapter類,經過繼承src類,實現dst類接口,完成src->dst的適配java
做用:將本來不兼容的接口融合在一塊兒工做spring
定義Voltage220Vmvc
//被適配對象:模擬220V的插座 public class Voltage220V { private int src = 220; //輸出220V電壓 public int output220V() { System.out.println("電壓="+src+"伏"); return src; } }
定義一個適合用戶使用的接口app
public interface IVoltage5V { public int output5V(); }
由一個適配器來繼承被適配的對象Voltage220V,同時實現用戶適合的接口,在這之中進行轉換框架
public class VoltageAdapter extends Voltage220V implements IVoltage5V { @Override public int output5V() { // TODO Auto-generated method stub int src = output220V(); //模擬src->dst的適配 int dst =src/44; return dst; } }
定義一個phone,這裏充當適配器模式中的使用者,所以在這裏聚合接口IVoltage5V,遵照ide
依賴倒置原則this
public class Phone { //定義手機的充電功能,聚合一個充電器接口 public void charging(IVoltage5V iVoltage5V) { int src = iVoltage5V.output5V(); System.out.println("輸出"+src+"V"); } }
最後由用戶來決定用哪一個適配器來對手機進行充電spa
public class client { public static void main(String[] args) { Phone phone = new Phone(); //使用VoltageAdapter充電器對手機進行充電 phone.charging(new VoltageAdapter()); } }
以上爲對工做原理圖的實現,參考該例子的實現思想和結構code
VoltageAdapter再也不繼承Voltage220V,而是直接聚合對象
public class VoltageAdapter implements IVoltage5V { //聚合Voltage220V對象 private Voltage220V voltage; public VoltageAdapter(Voltage220V voltage) { // TODO Auto-generated constructor stub this.voltage = voltage; } @Override public int output5V() { // TODO Auto-generated method stub int dst=0; if(voltage!=null){ int src = voltage.output220V(); //模擬src->dst dst =src/44; } return dst; } }
使用上
public class client { public static void main(String[] args) { Phone phone = new Phone(); //構造時須要傳入被適配對象 phone.charging(new VoltageAdapter(new Voltage220V())); } }
定義接口
public interface Interface2 { public void m1(); public void m2(); public void m3(); }
默認實現接口中的方法
public class AbsA implements Interface2{ @Override public void m1() { // TODO Auto-generated method stub } @Override public void m2() { // TODO Auto-generated method stub } @Override public void m3() { // TODO Auto-generated method stub } }
使用適配器時繼承AbsA或者在建立AbsA的時候能夠選擇性的重寫某些方法
//建立對象的時候重寫 AbsA a = new AbsA() { @Override public void m2() { // TODO Auto-generated method stub //進行方法實現 super.m2(); } };
DispatchServlet中首先獲得一個Controller類型,咱們經過該Controller類型來獲取HandlerAdapter的對應適配器類型,獲得這個適配器以後咱們就能夠調用對應的Controller的doHandler()方法
//定義一個Adapter接口 public interface HandlerAdapter { //判斷是否爲對應的Controller類型 public boolean supports(Object handler); //執行對應的控制器方法 public void handler(Object handler); } //實現多種適配器類 class SimpleHandlerAdapter implements HandlerAdapter{ @Override public boolean supports(Object handler) { return (handler instanceof SimpleController); } @Override public void handler(Object handler) { ((SimpleController)handler).doSimpleHandler(); } } class HttpHandlerAdapter implements HandlerAdapter{ //判斷是否爲對應的Controller類型 @Override public boolean supports(Object handler) { return (handler instanceof HttpController); } @Override public void handler(Object handler) { //執行對應的控制器方法 ((HttpController)handler).doHttpHandler(); } } class AnnotationHandlerAdapter implements HandlerAdapter{ //判斷是否爲對應的Controller類型 @Override public boolean supports(Object handler) { return (handler instanceof AnnotationController); } @Override public void handler(Object handler) { //執行對應的控制器方法 ((AnnotationController)handler).doAnnotationHandler(); } }
//模擬Controller的實現和各自的doHandler()方法 public interface Controller { } class HttpController implements Controller{ public void doHttpHandler() { System.out.println("HttpHandler...."); } } class AnnotationController implements Controller{ public void doAnnotationHandler() { System.out.println("AnnotationHandler...."); } } class SimpleController implements Controller{ public void doSimpleHandler() { System.out.println("SimpleHandler...."); } }
public class DispatchServlet { //模擬配置適配器 public static List<HandlerAdapter> handlerAdapters= new ArrayList<>(); static { handlerAdapters.add(new AnnotationHandlerAdapter()); handlerAdapters.add(new HttpHandlerAdapter()); handlerAdapters.add(new SimpleHandlerAdapter()); } public void doDispatch() { //模擬SpringMVC從request中獲取handler的對象 //適配器在這裏能夠獲取匹配的Controller AnnotationController controller = new AnnotationController(); // SimpleController controller = new SimpleController(); // HttpController controller = new HttpController(); //經過controller獲取適配器 HandlerAdapter adapter = getHandler(controller); //經過適配器執行對應的Controller方法 adapter.handler(controller); } private HandlerAdapter getHandler(Controller controller) { // 模擬源碼:經過遍歷的方式來匹配適配與controller類型 for(HandlerAdapter handler : this.handlerAdapters) { if(handler.supports(controller)) { return handler; } } return null; } public static void main(String[] args) { //模擬調用 new DispatchServlet().doDispatch(); //輸出AnnotationHandler...... } }
能夠發如今doDispatch中咱們獲取適配器的時候傳入了什麼類型的Controller就可以獲取對應的適配器,也自動的去調用對應的Controller執行Handler,在這一步徹底能夠適應傳入的Controller,不會由於傳入不一樣的Controller代碼失去做用,增長了靈活性,並且**擴展功能時只須要增長對應的適配器模塊和Controller模塊,配置在SpringMVC中,就同樣能夠被使用,代碼不用進行改動,這就是適配器模式的關鍵做用