“你好,阿米戈!今天,我要告诉你‘适配器’究竟是什么。我希望在学完本主题后,你会对输入/输出流有一个更好的了解。”

适配器 - 1

假设你的程序使用由其他程序员/公司编写的两个框架。这两个框架都非常好,并使用 OOP 原则:抽象、多态、封装。二者加起来几乎完全涵盖了程序所需执行的操作。只给你留下一个简单的任务。你需要将一个框架创建的对象传递给另一个框架。但是这两个框架完全不同,并且“不了解彼此”,即它们没有任何共同的类。你需要以某种方式将一个框架的对象转换为另一个框架的对象。

通过应用“适配器”技术(设计模式)可以很好地解决此任务:

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
 }
}
AlphaListManager 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 接口。

当有人调用这些方法时,类代码将调用“转发”到 list 变量,该变量是第一个框架中的 AlphaList

AlphaList 对象传递给 ListAdapter 构造方法

setSize 方法按以下规则操作:如果必须增加列表的大小,则添加空 (null) 项目。如果需要减小列表的大小,则删除末尾的项目。

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
有关如何使用它的示例

“我最喜欢最后一个示例。非常简洁易懂。”