天天看點

設計模式(13) --擴充卡模式(3種實作方式)

文章目錄

  • ​​基本介紹​​
  • ​​擴充卡模式工作原理​​
  • ​​三種實作方式​​
  • ​​類擴充卡模式​​
  • ​​注意:​​
  • ​​對象擴充卡​​
  • ​​總結​​
  • ​​接口擴充卡​​
  • ​​擴充卡模式在SpringMVC 架構應用的源碼剖析​​
  • ​​總結:​​

基本介紹

設計模式(13) --擴充卡模式(3種實作方式)

擴充卡模式工作原理

設計模式(13) --擴充卡模式(3種實作方式)

三種實作方式

類擴充卡模式

設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

代碼:

設計模式(13) --擴充卡模式(3種實作方式)

Voltage220V

//被适配的類
public class Voltage220V {
  //輸出220V的電壓
  public int output220V() {
    int src = 220;
    System.out.println("電壓=" + src + "伏");
    return src;
  }
}      

IVoltage5V

//适配接口
public interface IVoltage5V {
  public int output5V();
}      

VoltageAdapter

//擴充卡類
public class VoltageAdapter extends Voltage220V implements IVoltage5V {

  @Override
  public int output5V() {
    // TODO Auto-generated method stub
    //擷取到220V電壓
    int srcV = output220V();
    int dstV = srcV / 44 ; //轉成 5v
    return dstV;
  }
}      

測試:Client

public class Client {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println(" === 類擴充卡模式 ====");
    Phone phone = new Phone();
    phone.charging(new VoltageAdapter());
  }
}      
設計模式(13) --擴充卡模式(3種實作方式)

注意:

設計模式(13) --擴充卡模式(3種實作方式)

對象擴充卡

設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

類圖

設計模式(13) --擴充卡模式(3種實作方式)

代碼:

設計模式(13) --擴充卡模式(3種實作方式)

其他類不變,改下擴充卡類VoltageAdapter:

//擴充卡類
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;    
  }
}      

測試Client

public class Client {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println(" === 對象擴充卡模式 ====");
    Phone phone = new Phone();
    phone.charging(new VoltageAdapter(new Voltage220V()));
  }

}      
設計模式(13) --擴充卡模式(3種實作方式)

總結

設計模式(13) --擴充卡模式(3種實作方式)

接口擴充卡

設計模式(13) --擴充卡模式(3種實作方式)

安卓上使用接口擴充卡的執行個體:

設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

自己寫個案例:

設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

Interface4

public interface Interface4 {
  public void m1();
  public void m2();
  public void m3();
  public void m4();
}      

AbsAdapter

//在AbsAdapter 我們将 Interface4 的方法進行預設實作
public abstract class AbsAdapter implements Interface4 {

  //預設實作
  public void m1() {

  }

  public void m2() {

  }

  public void m3() {

  }

  public void m4() {

  }
}      

測試Client

public class Client {
  public static void main(String[] args) {
    
    AbsAdapter absAdapter = new AbsAdapter() {
      //隻需要去覆寫我們 需要使用 接口方法
      @Override
      public void m1() {
        // TODO Auto-generated method stub
        System.out.println("使用了m1的方法");
      }
    };
    
    absAdapter.m1();
  }
}      
設計模式(13) --擴充卡模式(3種實作方式)

擴充卡模式在SpringMVC 架構應用的源碼剖析

設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

動手寫 SpringMVC 通 過 擴充卡設計模式 擷取到對應的 Controller 的源碼

設計模式(13) --擴充卡模式(3種實作方式)

Controller

//多種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...");
  }
}      

HandlerAdapter

///定義一個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);
  }

}      

DispatchServlet

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...
  }
}      
設計模式(13) --擴充卡模式(3種實作方式)
設計模式(13) --擴充卡模式(3種實作方式)

個人感覺:這個寫法太精妙了,因為各個controller方法名不同。①怎麼讓這些方法變成一個統一的? 于是想到用每個controller對應一個adapter實作類,這個adapter統一實作adapet接口。②如何判斷傳進來的controller用哪個adapt實作類?這句話白話說就是 根據controller找到對應的adapt,于是在dispatchservelt中先把所有的adapt實作來放在一個集合中,周遊,用每個adapt提供的support方法,找到自己。于是 就是可以使用這個對應的adapter幹自己喜歡的事情了。!!

總結:

繼續閱讀