程序猿學社的GitHub,歡迎Star
github技術專題
本文已記錄到github
前言
到目前爲止,創建型模式,我們已經知道是怎麼一回事咯,從今天開始結構型模式的適配器模式相關學習。
結構型模式作用?
- 實現鬆耦合,從而可以擴大整體類結構,用來解決更大的問題
什麼是適配器模式?
- 將一個類的接口轉換成客戶希望的另外一個接口。解決兼容性的問題,讓原本因爲不兼容不能一起工作的兩個類可以一起工作。
工作原理
待適配的類:適配的類或者接口,定義待適配的接口
適配器:調用是適配的類,轉爲客戶期望的類,解決兼容問題
目標:客戶希望的接口或者類
場景案例
- CAN轉USB接口
- 三口插座轉爲二口-轉換插頭
- usb網線轉換器(主要是針對超薄本),無網線插頭,可通過轉換器實現
- 例如我們找工作,其實也是一個適配的過程,對照工作要求進行適配。
隔壁老王: “社長,你這說的都是啥,說的我一臉懵逼的,能否詳細說說”
社長: “老王,剛剛我們已經知道適配器的概念和場景,你聽着有點懵逼正常,那是因爲剛剛都是停留在理論階段,沒有跟生活更好的結合起來,爲了方便理解,我畫了一個圖”
實戰
類適配器
網線
package com.cxyxs.designmode.adapter;
/**
* Description:網線
* Author: 程序猿學社
* Date: 2020/5/16 23:50
* Modified By:
*/
public class Reticle {
public void Internet(){
System.out.println("插上網線,開始網上衝浪。。。");
}
}
USB適配接口
package com.cxyxs.designmode.adapter;
/**
* Description:USB適配接口
* Author: 程序猿學社
* Date: 2020/5/17 0:22
* Modified By:
*/
public interface Usb {
public void conversion();
}
- 處理上網的請求
適配器
package com.cxyxs.designmode.adapter;
/**
* Description:適配器
* Author: 程序猿學社
* Date: 2020/5/16 23:55
* Modified By:
*/
public class UsbAdapter extends Reticle implements Usb{
@Override
public void conversion() {
super.Internet();
}
}
- 等價於USB轉接器
電腦
package com.cxyxs.designmode.adapter;
/**
* Description:超薄電腦
* Author: 程序猿學社
* Date: 2020/5/16 23:52
* Modified By:
*/
public class UltraThinPc {
/**
* 網上衝浪
* @param usb
*/
public void surfing(Usb usb){
usb.conversion();
};
}
隔壁老王: “買了一臺電腦,只有USB接口,我們需要上網咋辦?”
社長: “我們需要買一個USB網線轉換器,就可以實現上網功能,所以這裏需要聚合一個USB的接口,這樣就可以實現上網功能”
測試類
package com.cxyxs.designmode.adapter;
/**
* Description:
* Author: 程序猿學社
* Date: 2020/5/17 0:02
* Modified By:
*/
public class Client {
public static void main(String[] args) {
UsbAdapter usb = new UsbAdapter();
UltraThinPc ultraThinPc = new UltraThinPc();
ultraThinPc.surfing(usb);
}
}
社長: “說了這麼多,我們來總結一下類適配器”
類適配器缺點:
- 類適配器(UsbAdapter)使用了單繼承(Reticle網線),會有侷限性。
隔壁老王: “既然,類適配器存在單繼承的問題,有沒有版本去改進”
社長: “有辦法的,我們可以採用對象適配器的方式”
對象適配器
對象適配器
package com.cxyxs.designmode.adapter.newclass;
import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.Usb;
/**
* Description:適配器
* Author: 程序猿學社
* Date: 2020/5/16 23:55
* Modified By:
*/
public class UsbNewAdapter implements Usb{
private Reticle reticle;
public UsbNewAdapter(Reticle reticle) {
this.reticle = reticle;
}
@Override
public void conversion() {
reticle.Internet();
}
}
- 把繼承換成聚合,解決了單繼承的問題
客戶端
package com.cxyxs.designmode.adapter.newclass;
import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.UltraThinPc;
import com.cxyxs.designmode.adapter.UsbAdapter;
/**
* Description:
* Author: 程序猿學社
* Date: 2020/5/17 0:02
* Modified By:
*/
public class NewClient {
public static void main(String[] args) {
//網線
Reticle reticle = new Reticle();
UsbNewAdapter usb = new UsbNewAdapter(reticle);
UltraThinPc ultraThinPc = new UltraThinPc();
ultraThinPc.surfing(usb);
}
}
作者:程序猿學社
原創公衆號:『程序猿學社』,專注於java技術棧,分享java各個技術系列專題,以及各個技術點的面試題。
原創不易,轉載請註明來源(註明:來源於公衆號:程序猿學社, 作者:程序猿學社)。