“你好,阿米戈!今天我將告訴你究竟什麼是 «適配器»。我希望在學習了這個主題之後,您會對輸入/輸出流有更好的理解。”

適配器 - 1

想像一下你的程序使用了兩個由其他程序員/公司編寫的框架。這兩個框架都很好,都使用了面向對象的原則:抽象、多態、封裝。它們一起幾乎完全涵蓋了您的程序需要做的事情。你只剩下一個簡單的任務。您需要將一個框架創建的對像傳遞給另一個框架。但是這兩個框架完全不同並且“彼此不了解”,即它們沒有任何共同的類。您需要以某種方式將一個框架的對象轉換為另一個框架的對象。

這個任務可以通過應用«適配器»技術(設計模式)完美地解決:

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);
}
一個如何使用它的例子

“我最喜歡你的最後一個例子。非常簡潔易懂。”