在現實生活中,經常出現兩個對象因接口不兼容而不能在一起工作的實例,這時需要第三者進行適配。例如,講中文的人同講英文的人對話時需要一個翻譯,用直流電的筆記本電腦接交流電源時需要一個電源適配器。
在軟件設計中也可能出現:需要開發的具有某種業務功能的組件在現有的組件庫中已經存在,但它們與當前系統的接口規範不兼容,如果重新開發這些組件成本又很高,這時用適配器模式能很好地解決這些問題。
適配器模式(Adapter)的定義如下:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類能一起工作。適配器模式分爲類結構型模式和對象結構型模式兩種,前者類之間的耦合度比後者高,且要求程序員瞭解現有組件庫中的相關組件的內部結構,所以應用相對較少些。
模式的結構與實現
類適配器模式可採用多重繼承方式實現,如 C++ 可定義一個適配器類來同時繼承當前系統的業務接口和現有組件庫中已經存在的組件接口;Java 不支持多繼承,但可以定義一個適配器類來實現當前系統的業務接口,同時又繼承現有組件庫中已經存在的組件。
對象適配器模式可釆用將現有組件庫中已經實現的組件引入適配器類中,該類同時實現當前系統的業務接口。現在來介紹它們的基本結構。
1. 模式的結構
適配器模式(Adapter)包含以下主要角色。
- 目標(Target)接口:當前系統業務所期待的接口,它可以是抽象類或接口。
- 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
- 適配器(Adapter)類:它是一個轉換器,通過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。
類適配器模式的結構圖如下圖
對象適配器模式的結構圖如下圖
(1) 類適配器模式的代碼如下
//目標接口
interface Target
{
public void request();
}
//適配者接口實現
class Adaptee
{
public void specificRequest()
{
System.out.println("適配者中的業務代碼被調用!");
}
}
//類適配器類
class ClassAdapter extends Adaptee implements Target
{
public void request()
{
specificRequest();
}
}
//客戶端代碼
public class ClassAdapterTest
{
public static void main(String[] args)
{
System.out.println("類適配器模式測試:");
Target target = new ClassAdapter();
target.request();
}
}
程序的運行結果如下:
類適配器模式測試: 適配者中的業務代碼被調用!
(2)對象適配器模式的代碼如下
//目標接口
interface Target
{
public void request();
}
//適配者接口實現
class Adaptee
{
public void specificRequest()
{
System.out.println("適配者中的業務代碼被調用!");
}
}
//對象適配器類
class ObjectAdapter implements Target
{
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.specificRequest();
}
}
//客戶端代碼
public class ObjectAdapterTest
{
public static void main(String[] args)
{
System.out.println("對象適配器模式測試:");
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
程序的運行結果如下:
對象適配器模式測試: 適配者中的業務代碼被調用!
案例展示,將原有的電能發動機和光能發動機的方法統一爲發動機接口的drive()方法
package adapter;
//目標:發動機
interface Motor
{
public void drive();
}
//適配者1:電能發動機
class ElectricMotor
{
public void electricDrive()
{
System.out.println("電能發動機驅動汽車!");
}
}
//適配者2:光能發動機
class OpticalMotor
{
public void opticalDrive()
{
System.out.println("光能發動機驅動汽車!");
}
}
//電能適配器
class ElectricAdapter implements Motor
{
private ElectricMotor emotor;
public ElectricAdapter()
{
emotor=new ElectricMotor();
}
public void drive()
{
emotor.electricDrive();
}
}
//光能適配器
class OpticalAdapter implements Motor
{
private OpticalMotor omotor;
public OpticalAdapter()
{
omotor=new OpticalMotor();
}
public void drive()
{
omotor.opticalDrive();
}
}
//客戶端代碼
public class MotorAdapterTest
{
public static void main(String[] args)
{
System.out.println("適配器模式測試:");
Motor motor=new OpticalAdapter();
motor.drive();
}
}