“你好,阿米戈!今天我將告訴你究竟什麼是 «適配器»。我希望在學習了這個主題之後,您會對輸入/輸出流有更好的理解。”
想像一下你的程序使用了兩個由其他程序員/公司編寫的框架。這兩個框架都很好,都使用了面向對象的原則:抽象、多態、封裝。它們一起幾乎完全涵蓋了您的程序需要做的事情。你只剩下一個簡單的任務。您需要將一個框架創建的對像傳遞給另一個框架。但是這兩個框架完全不同並且“彼此不了解”,即它們沒有任何共同的類。您需要以某種方式將一個框架的對象轉換為另一個框架的對象。
這個任務可以通過應用«適配器»技術(設計模式)完美地解決:
Java代碼 |
描述 |
class MyClass implements Interface2
{
private Interface1 object;
MyClass(Interface1 object)
{
this.object = object;
}
// This is where we put the Interface2 methods
// that call Interface1 methods
}
|
這反映了適配器設計模式。
基本思想是 MyClass 類將一個接口轉換(適配)為另一個接口。 |
“你能舉個更具體的例子嗎?”
“好吧。假設每個框架都有自己獨特的“列表”界面。它們可能看起來像這樣:”
Java代碼 |
描述 |
interface AlphaList
{
void add(int value);
void insert(int index, int value);
int get(int index);
void set(int index, int value);
int count();
void remove(int index);
}
|
來自第一個 ( Alpha ) 框架的代碼
AlphaList是允許框架代碼與使用框架的代碼進行交互的接口之一。 |
class AlphaListManager
{
public static AlphaList createList()
{
//some code to create an object
}
}
|
AlphaList Manager AlphaListManager 是框架中的一個類。它的 createList 方法創建一個AlphaList對象 |
interface BetaList
{
int getValue(int index);
void setValue(int index, int value);
int getSize();
void setSize(int newSize);
}
class BetaSaveManager
{
public static void saveList(BetaList list)
{
//some code to save a BetaList object
//to a file on disk
}
}
|
來自第二個 ( Beta ) 框架的代碼。
BetaList是允許框架代碼與使用框架的代碼進行交互的接口之一。
BetaSaveManager是框架中的一個類。它的saveList方法保存了一個BetaList對象 |
class ListAdapter implements BetaList
{
private AlphaList list;
ListAdapter(AlphaList list)
{
this.list = list;
}
int getValue(int index)
{
return this.list.get(index);
}
void setValue(int index, int value)
{
this.list.set(index, value);
}
int getSize()
{
return this.list.count();
}
void setSize(int newSize)
{
if (newSize > this.list.count()
{
while (this.list.count() < newSize)
{
this.list.add(null);
}
}
else if (newSize < this.list.count() {
while (this.list.count() > newSize)
{
list.remove(list.count() - 1);
}
}
}
}
|
從AlphaList接口轉換為BetaList接口的«Adapter» 類
ListAdapter類實現了第二個框架的BetaList接口。
當有人調用這些方法時,類代碼“轉發”對列表變量的調用,它是來自第一個框架的AlphaList 。
一個AlphaList對像被傳遞給ListAdapter構造函數
setSize方法根據以下規則運行:如果必須增加列表的大小,則添加空 (null) 項。如果需要減少列表的大小,請刪除末尾的項目。 |
public static void main(String[] args)
{
AlphaList listAlpha = AlphaListManager.createList();
BetaList listBeta = new ListAdapter(listAlpha);
BetaSaveManager.saveList(listBeta);
}
|
一個如何使用它的例子 |
“我最喜歡你的最後一個例子。非常簡潔易懂。”
GO TO FULL VERSION