【正文】
我們知道,android中最重要也是最難用的ui控件就是listview清單控件,而要想靈活運用它,則必須要用到擴充卡adapter,是以,我覺得還是很有必要來學習一下java當中的擴充卡模式(不管以後能不能用到),畢竟java語言是android開發很重要的一個基礎。
完全了解擴充卡模式,有很多知識要學習,例如:擴充卡模式有類的擴充卡模式和對象的擴充卡模式兩種不同的形式。但作為初學者,我就簡單學習一下配器模式入門知識吧,以後會不斷完善。希望奮鬥在碼農路上的童鞋們莫吐槽→_→
一、擴充卡介紹:
将一個類的接口轉換成客戶希望的另外一個接口。擴充卡模式使得原本由于接口不相容而不能一起工作的那些類可以一起工作。
擴充卡模式在現代的java架構中十分常用。這種模式适用于以下場景:想使用一個已存在的類,但是該類不符合接口需求;或者需要建立一個可重用的類,适配沒有提供合适接口的其它類。
二、蘋果和桔子的例子:
擴充卡的思想可以通過下面這個簡單的例子說明。這個示例要讓一個桔子被“适配”成一個蘋果。如下圖所示:

上圖中的下半部分可以看到,擴充卡包含了一個桔子執行個體并且繼承了蘋果類。桔子對象放在了擴充卡中,于是桔子表現得就像蘋果一樣了。對應的邏輯圖如下:
三、插座盒插頭的例子:
上圖中,我們可以通過中間的擴充卡讓右邊的插頭成功連接配接上左邊的插座。
四、插頭擴充卡的代碼實作:
在這個例子當中,我們想讓powerb調用powera中start()方法裡的代碼;當然,我們也不想重複寫被注釋掉的23、25行代碼。這個時候就可以用擴充卡模式。
上述代碼解釋:
第30行:開始定義擴充卡,也是核心代碼的開始;
第33、34行:通過構造方法将powerb傳進來;
第37行代碼:既然是實作接口powera,則必然要實作powera裡面的方法insert();
第38行代碼:我們在powera的insert()方法中,去調用powerb的connect()方法;
緊接着,第10、11、12行代碼的意思是:在new一個powerb的時候,我們把它傳到擴充卡poweraadapter裡面去,啟動擴充卡,然後powerb就會去執行第16、24、18行的代碼。
注:16、24、18這個順序沒有錯,因為我們在擴充卡中相當于是已經将24行代碼替換為了第17行代碼。
運作效果如下:
同理,如果我也想把powera作為powerb去使用,可以再定義一個擴充卡powerbadapter,實作雙向擴充卡。
五、小總結:
上方第23、25行被注釋掉的代碼,表示是很多重複的代碼,不符合面向對象的思維方式。我們現在設想這樣一個例子:我們的項目已經上線并且客戶正在使用,但是後來增加了一些新的需求。而面向對象有一條oo原則就是:對修改關閉(上線後,代碼盡量不要修改,不然可能會發生連鎖反應,導緻其他調用此處方法的代碼都可能出問題),對擴充開放(自己定義的新的方法,别人還沒有調用,我們當然可以修改)。此時,我們可以通過擴充卡來減少這些重複的代碼。
六:oo設計原則:
面向接口程式設計(面向抽象程式設計)
封裝變化
多用組合,少用繼承
對修改關閉 對擴充開放
個人感覺,這些設計原則,需要在實踐中不斷加深了解,在這裡就不過多描述了哦~