Adapter 適配器模式
適配器:
也稱包裝樣式或者包裝(wrapper)。將一個類的接口轉接成用戶所期待的。
一個適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。主要分爲三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
類適配器是通過類的繼承實現的適配;
對象適配器是通過對象間的關聯關係,組合關係實現的適配;
接口適配器用一個抽象類實現該接口所有方法,在繼承該抽象類重寫想要的方法。適配器模式說明
- Target 目標角色 該角色定義把其他類轉換爲何種接口,也就是我們的期望接
口。 - Adaptee 源角色 你想把“誰”轉換成目標角色,這個“誰”就是源角色,它是已經存
在的、運行良好的類或對象。 - Adapter 適配器角色 適配器模式的核心角色,其他兩個角色都是已經存在的角
色,而適配器角色是需要新建立的,他的職責非常簡單:把源角色轉換爲目標
角色。
- Target 目標角色 該角色定義把其他類轉換爲何種接口,也就是我們的期望接
適配器模式優點
- 適配器模式可以讓兩個沒有任何關係的類在一起運行,只要適配器這個角色能
夠搞定他們就成。 - 增加了類的透明性。我們訪問的是目標角色,但是實現卻在源角色裏。
- 提高了類的複用度。源角色在原有系統中還是可以正常使用的。
- 靈活性非常好。不想要適配器時,刪掉這個適配器就好了,其他代碼不用改。
類適配器示例類圖:
- 適配器模式可以讓兩個沒有任何關係的類在一起運行,只要適配器這個角色能
類適配器示例代碼:
//Target 目標接口,或稱爲標準接口
public interface TargetUSBPort {
public void onUSB();
}
// PS2圓接口
public interface PS2Port {
public void onPS2();
}
// Adaptee 具有特殊功能、但不符合我們現有的標準接口的類
public class AdapteePS2Port implements PS2Port {
@Override
public void onPS2() {
System.out.println("PS2接口的鍵盤...");
}
}
// Adapter 適配器類,繼承了被適配類,同時實現標準接口。(類適配器)
public class AdapterPS2ToUSB extends AdapteePS2Port implements TargetUSBPort {
@Override
public void onUSB() {
System.out.println("類適配器 轉換...");
this.onPS2();
}
}
// Client
public class ClientPC {
public static void main(String[] args) {
// 類適配器
TargetUSBPort adapter = new AdapterPS2ToUSB();
adapter.onUSB();
}
}
對象適配器示例類圖:
對象適配器示例代碼:
//Target 目標接口,或稱爲標準接口
public interface TargetUSBPort {
public void onUSB();
}
// PS2圓接口
public interface PS2Port {
public void onPS2();
}
// Adaptee 具有特殊功能、但不符合我們現有的標準接口的類
public class AdapteePS2Port implements PS2Port {
@Override
public void onPS2() {
System.out.println("PS2接口的鍵盤...");
}
}
// Adapter 適配器類,直接關聯被適配類。(對象適配器)
public class AdapterPS2ToUSB2 implements TargetUSBPort {
private PS2Port ps2Port;
// 通過構造函數傳入具體需要適配的被適配類對象
public AdapterPS2ToUSB2(PS2Port ps2Port) {
this.ps2Port = ps2Port;
}
@Override
public void onUSB() {
System.out.println("轉換...");
// 使用委託的方式完成特殊功能
ps2Port.onPS2();
}
}
// Client
public class ClientPC {
public static void main(String[] args) {
// 對象適配器
PS2Port adaptee = new AdapteePS2Port();
TargetUSBPort adapter2 = new AdapterPS2ToUSB2(adaptee);
adapter2.onUSB();
}
}
- 接口適配器示例:
可以讓用戶更加方便的使用該接口,比如一個接口有很多方法,而只需要實現其中一兩個方法,其他方法也不得不實現帶來不必要的麻煩。
在GUI編程是經常遇到這類問題,比如 java.awt.event.WindowListener 有7個方法
windowOpened(WindowEvent)
windowClosing(WindowEvent)
windowClosed(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
所以提供了
java.awt.event.WindowAdapter implements WindowListener, WindowStateListener, WindowFocusListener
WindowAdapter方便了我們編寫代碼,只需要繼承重寫想要的方法即可。