意圖
將一個類的接口轉換成另外一個客戶希望的接口。Adapter 模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
適用性
- 你想使用一個已經存在的類,而它的接口不符合你的需求。
- 你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
- (僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。
Java實現
假設目前做一個新系統,有如下代碼結構。
public interface Car{
public void drive();
}
public class Benz implements Car{
public void drive(){
System.out.println("Benz run");
}
}
public class Cruze implements Car{
public void drive(){
System.out.println("Cruze run");
}
}
有一個老系統,裏面有如下代碼
public class Smart{
public void run(){
System.out.println("Smart run");
}
}
類適配器:
public class SmartCar extends Smart implements Car{
public void drive(){
this.run();
}
}
對象適配器:
public class SmartCar implements Car{
private Smart smart = new Smart();
public void drive(){
smart.run();
}
}
Clojure實現
first-class function輕鬆解決!
(defn drive []
(println "drive"))
(defn run []
(println "run"))
(defn do-drive [f]
(f))
(do-drive drive)
(do-drive run)