天天看點

6、擴充卡模式1、繼承(類擴充卡)2、組合(對象擴充卡)3、總結

文章目錄

  • 1、繼承(類擴充卡)
    • 1.1、電腦 Computer
    • 1.2、網線 NetCable
    • 1.3、轉換器标準接口 NetToUSB
    • 1.4、真正的擴充卡 Adapter
    • 1.5、Test
    • 1.6、Result
  • 2、組合(對象擴充卡)
    • 2.1、新組合型擴充卡 AdapterNew
    • 2.2、Test
  • 3、總結

将一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不相容而不能一起工作的那些類能一起工作

1、繼承(類擴充卡)

因為java單繼承的局限性,更常用的是第二種組合方式的對象擴充卡
  • 需求:上網
  • 已備:電腦,網線
  • 問題:電腦沒有網線插口
  • 方案:插個網線USB轉換器(擴充卡)
    • 繼承實作的擴充卡在 1.4

1.1、電腦 Computer

// 用戶端類:電腦(想上網,但沒有網線接口)
public class Computer {
    public void net(NetToUSB ntu){
        // 上網,但是本身無法和網線适配,需要找一個轉接頭,傳入一個轉接器就可以了
        ntu.handleRequest();
    }
}
           

1.2、網線 NetCable

// 要被适配的類:網線
public class NetCable {
    public void webSurfing(){
        System.out.println("上網沖浪~");
    }
}
           

1.3、轉換器标準接口 NetToUSB

// 接口轉換器的抽象
public interface NetToUSB {
    // 作用:處理請求(把網線插到USB上)
    public void handleRequest();
}
           

1.4、真正的擴充卡 Adapter

  • extends NetCable

    繼承實作的類擴充卡
// 真正的擴充卡(需要連接配接網線,連接配接USB)
public class Adapter extends NetCable implements NetToUSB {
    @Override
    public void handleRequest() {
        super.webSurfing();
    }
}
           

1.5、Test

Computer cp = new Computer(); // 一台電腦
NetCable wx = new NetCable(); // 一根網線
NetToUSB ad = new Adapter(); // 一個轉接器
// 電腦插上轉接器就可以上網了
cp.net(ad);
           

1.6、Result

上網沖浪~
           

2、組合(對象擴充卡)

因為java單繼承的局限性,更常用的就是組合方式的對象擴充卡
  • 同上面的需求,不過不是繼承,而是組合

2.1、新組合型擴充卡 AdapterNew

public class AdapterNew implements NetToUSB {

    private NetCable netCable;

    public AdapterNew(NetCable netCable) {
        this.netCable = netCable;
    }

    @Override
    public void handleRequest() {
        netCable.webSurfing();
    }
}
           

2.2、Test

Computer cp = new Computer(); // 一台電腦
NetCable wx = new NetCable(); // 一根網線
NetToUSB ad = new AdapterNew(wx); // 一個轉接器
// 電腦插上轉接器就可以上網了
cp.net(ad);
           
Result同上

3、總結

  • 對象擴充卡優點
    • 一個對象擴充卡可以把多個不同的适配者适配到同一個目标
    • 可以适配一個适配者的子類,由于擴充卡和适配者之間的關系是關聯關系,根據 “裡氏替換原則” ,适配者的子類也可以通過該擴充卡進行适配
  • 類擴充卡缺點
    • 對于單繼承語言來說
      • 一次隻能适配一個适配者類
      • 目标類隻能為接口
  • 适用場景
    • 凡需要适配的場景,都可以用,擴充卡模式就是字面意思