“你好,阿米戈!今天,我要告诉你‘适配器’究竟是什么。我希望在学完本主题后,你会对输入/输出流有一个更好的了解。”
假设你的程序使用由其他程序员/公司编写的两个框架。这两个框架都非常好,并使用 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);
}
|
有关如何使用它的示例 |
“我最喜欢最后一个示例。非常简洁易懂。”
GO TO FULL VERSION