將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
類型:結構型模式。
類圖:
1、你想使用一個已經存在的類,而它的接口不符合你的需求。
2、你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
參與者
1、Target (Three Hole)
定義Client使用的與特定領域相關的接口。
2、Client (Hotel)
與符合Target接口的對象協同。
3、Adaptee (TwoHole)
定義一個已經存在的接口,這個接口需要適配。
4、Adapter (Three_Swith_Two_Adapter)
對Adaptee的接口與Target接口進行適配。
例子: 使用 三孔插孔 轉換爲 二口插孔的例子。 假如你外出旅遊帶的手機充電器是二孔插頭,但是入住的旅店只有三孔插孔(不考慮三孔可以插二孔的情況),,,這時候你下樓 買了一個 三孔轉化爲二孔的適配器
package com.zq.designpattern.adatper;
/**
* Created by zhengshouzi on 2015/10/26.
*/
//三孔插座的標準
interface ThreeHole{
void doSomething();
}
//三孔插座的實現
class ThreeHoleImpl implements ThreeHole{
@Override
public void doSomething() {
System.out.println("使用 三孔 充電");
}
}
//兩孔插座的標準
interface TwoHole{
void doSomething();
}
//兩孔插座的實現
class TwoHoleImpl implements TwoHole{
@Override
public void doSomething() {
System.out.println("使用 二孔 充電");
}
}
//三孔 轉 二孔的適配器
class Three_Swith_Two_Adapter implements ThreeHole {
private TwoHole twoHole;
//此適配器 必須要有 一個二孔的插口才能工作
public Three_Swith_Two_Adapter(TwoHole twoHole){
this.twoHole = twoHole;
}
@Override
public void doSomething() {
twoHole.doSomething();
}
}
class Hotel{
//旅館默認是三孔的充電器
private ThreeHole threeHole = new ThreeHoleImpl();
//給旅館加上適配器
public void setSwitcher(ThreeHole threeHole){
this.threeHole = threeHole;
}
//充電
public void charge(){
threeHole.doSomething();
}
}
public class AdapterPattern {
public static void main(String[] args) {
//找了一個旅館住下
Hotel hotel = new Hotel();
//如果你是三孔的充電器,開始充電,直接充電
hotel.charge();
//如果你帶的是二孔的充電器,拿出二孔的充電器,發現沒法充電
TwoHole twoHole = new TwoHoleImpl();
//這時候你下樓買一個 三孔 轉換 二孔的適配器
//適配器的構造函數,說我需要一個二孔的插頭插在我上面
ThreeHole threeHole = new Three_Swith_Two_Adapter(twoHole);
//這個時候將適配器插在旅館的 三孔排插上
hotel.setSwitcher(threeHole);
//開始充電
hotel.charge();
}
}
看了這個代碼,你可以試試自己寫一個把 二孔轉化爲 三孔的適配器。