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