1. 程式人生 > >我對於介面卡模式的理解

我對於介面卡模式的理解

介面卡模式

概念

在設計模式中,介面卡模式(英語:adapter pattern)有時候也稱包裝樣式或者包裝(wrapper)。將一個類的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類能在一起工作,做法是將類自己的介面包裹在一個已存在的類中。引用自wiki

介紹使用

介面卡模式總共由三個角色組成,分別是目標物件Target,被適配物件Adaptee和介面卡Adapter。總共有兩種型別,分別是類介面卡模式,物件介面卡模式。

  1. 類介面卡模式:介面卡繼承目標物件,實現被適配物件的介面,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充電口就是目標類,普通充電器就是被適配物件,轉接頭就是介面卡。在這裡是使用了類介面卡模式去實現的,不過有點牽強。這個例子使用物件介面卡更合適一些。

  1. 物件介面卡模式:介面卡繼承自目標類,並且包含一個被適配的物件的例項。程式碼如下:
    // 充電轉介面
    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。當然,這個是個人覺得比較合理的理解,歡迎大家交流討論。

參考