天天看點

設計模式--擴充卡模式設計模式--擴充卡模式

設計模式--擴充卡模式

設計模式--擴充卡模式設計模式--擴充卡模式

擴充卡模式基本介紹

基本介紹

  • 擴充卡模式(Adapter Pattern)将某個類的接口轉換成客戶期望的另一個接口表示,主要目的是相容性,讓原本因接口不比對不能一起各種的兩個類可以協同各種,其别名為包裝器(Wrapper)
  • 擴充卡屬于結構型模式
  • 主要分為三類:類擴充卡模式、對象擴充卡模式、接口擴充卡模式

工作原理

  • 擴充卡模式:将一個類的接口轉換成另一種接口,讓原本接口不相容的類可以相容
  • 從使用者的角度看不到被适配者,是解耦的
  • 使用者調用擴充卡轉換出來的目标接口方法,擴充卡在調用被适配者的相關接口方法
  • 使用者收到回報結果,感覺隻是和目标接口互動

生活中擴充卡例子:

多功能插座

設計模式--擴充卡模式設計模式--擴充卡模式

-==================================================

假設目前我們有220V電壓,手機不可以直接使用,手機直流電是5V

類擴充卡模式

建立被适配的類

//被适配的類
public class Voltage220V {

    public int output220v(){
        int src = 220;
        System.out.println("輸出電壓"+src+"伏");
        return src;
    }
}           

新增适配接口

//适配接口
public interface IVoltage5V {

    public int output5V();
}           

新增擴充卡

public class VoltageAdapter extends Voltage220V implements IVoltage5V{

    @Override
    public int output5V() {
        //擷取到220V的帶你優雅
        int i = output220v();
        int dstV = i / 44;  //專程5V
        return dstV;
    }
}           

新增手機類使用擴充卡

public class Phone {

    //充電
    public void charging(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5V() == 5){
            System.out.println("電壓 5 V 可以充電");
        }else{
            System.out.println("不能充電");
        }
    }
}           

測試

public class Client {
    //使用
    public static void main(String[] args) {
        System.out.println("===  類擴充卡  ===");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}           
設計模式--擴充卡模式設計模式--擴充卡模式

對象擴充卡

//被适配的類
public class Voltage220V {

    public int output220v(){
        int src = 220;
        System.out.println("輸出電壓"+src+"伏");
        return src;
    }
}           
//适配接口
public interface IVoltage5V {

    public int output5V();
}           
public class VoltageAdapter implements IVoltage5V{

    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int dst = 0;
        if(voltage220V != null){
            int src = voltage220V.output220v();//擷取220v 電壓
            System.out.println("使用對象擴充卡~~~");
            dst = src / 44;
            System.out.println("輸出的電壓"+ dst);
        }
        return dst;
    }
}           

新增手機适配

public class Phone {

    //充電
    public void charging(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5V() == 5){
            System.out.println("電壓 5 V 可以充電");
        }else{
            System.out.println("不能充電");
        }
    }
}
           
public class Client {
    //使用
    public static void main(String[] args) {
        System.out.println("===  對象擴充卡  ===");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }
}           
設計模式--擴充卡模式設計模式--擴充卡模式

接口擴充卡模式

  • 一些書籍稱為:擴充卡模式 當不需要全部實作提供當接口方法時,可先設計一個抽象類實作接口,并為該接口中每個方法提供一個預設的實作(空方法),那麼該抽象類的子類可有選擇地覆寫父類的某些方法來實作需求
  • 适用于一個接口不想使用其所有的方法的情況。

建立接口

public interface Interface4 {

    public void m1();
    public void m2();
    public void m3();
    public void m4();

}
           

抽象實作類

//在AbsAdapter 我們将Interface4的方法 空實作
public abstract class AbsAdapter implements Interface4{

    public void m1(){

    }
    public void m2(){

    }
    public void m3(){

    }
    public void m4(){

    }

}           

選擇性實作

public class Client {
    //使用
    public static void main(String[] args) {
        AbsAdapter absAdapter = new AbsAdapter() {
            @Override
            public void m1() {
                System.out.println("使用了m1方法");
            }
        };
        absAdapter.m1();
    }
}
           
設計模式--擴充卡模式設計模式--擴充卡模式

擴充卡模式在我們 SpringMVC 架構的 HandlerAdapter,就使用了擴充卡模式

個人部落格:

http://blog.yanxiaolong.cn/

繼續閱讀