我對於介面卡模式的理解
介面卡模式
概念
在設計模式中,介面卡模式(英語:adapter pattern)有時候也稱包裝樣式或者包裝(wrapper)。將一個類的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類能在一起工作,做法是將類自己的介面包裹在一個已存在的類中。引用自wiki
介紹使用
介面卡模式總共由三個角色組成,分別是目標物件Target,被適配物件Adaptee和介面卡Adapter。總共有兩種型別,分別是類介面卡模式,物件介面卡模式。
- 類介面卡模式:介面卡繼承目標物件,實現被適配物件的介面,java沒有多繼承,所以採用實現介面的方式。檢視例項程式碼如下:
// 目標類 typec充電口
abstract class TypecCharger {
public abstract void typecCharge();
}
// 被介面卡充電口
interface CommonCharger {
void commonCharge();
}
// 充電轉介面 class ChargerAdapter extends TypecCharger implements CommonCharger { @Override public void typecCharge() { commonCharge(); } @Override public void commonCharge() { System.out.println("充電"); } }
// 呼叫程式碼如下
public void charge() {
TypecCharger typecCharger = new ChargerAdapter();
typecCharger.typecCharge();
}
typec充電口和普通充電口不相容,最終想實現的目的是可以使有typec充電口的手機使用普通充電器經過轉接頭順利充電。所以typec充電口就是目標類,普通充電器就是被適配物件,轉接頭就是介面卡。在這裡是使用了類介面卡模式去實現的,不過有點牽強。這個例子使用物件介面卡更合適一些。
- 物件介面卡模式:介面卡繼承自目標類,並且包含一個被適配的物件的例項。程式碼如下:
// 充電轉介面
class ChargerAdapter extends TypecCharger {
CommonCharger commonCharger;
public ChargerAdapter(CommonCharger commonCharger) {
this.commonCharger = commonCharger;
}
@Override
public void typecCharge() {
commonCharger.commonCharge();
}
}
// 呼叫程式碼如下
public void charge() {
TypecCharger typecCharger = new ChargerAdapter(new AndroidCommonCharger());
typecCharger.typecCharge();
}
這樣一來就好理解一點了,介面卡裡面包裝了被適配物件,真正的執行邏輯有被適配物件實現,介面卡只是做個類似中轉的角色,委託給被適配物件。
想法
在平時安卓開發過程中,用的最多的就是recycleview和adapter做列表的渲染,最早接觸介面卡模式,我也是想到這個例子,但是去看了相關的文章,總覺得不是很對的上。所以自己就從概念上的角色去分析, 個人覺得recycleview中的角色分工如下:資料來源是被適配物件Adaptee, 渲染得到的view是目標物件Target,adapter就是介面卡角色。 資料來源在adapter內部通過onBindViewHolder, onCreateViewHolder把資料轉化為目標物件——列表的view,從而得到的view就可以交由recycleview去渲染了。也就是從不相關不相容的資料通過adapter轉為相容的view給recycleview。當然,這個是個人覺得比較合理的理解,歡迎大家交流討論。