原理或定義
適配器就是一種適配中間件,它存在於不匹配的二者之間,用於連接二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭,轉換器之類的存在。
將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由於接口不兼容而不能一起工作那些類可以一起工作。
結構
目標接口(Target): 客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
需要適配的類(Adaptee): 需要適配的類或適配者類。
適配器(Adapter): 通過包裝一個需要適配的對象,把原接口轉換成目標接口。
分類
1) 類適配器
當客戶在接口中定義了他期望的行爲時,我們就可以應用適配器模式,提供一個實現該接口的類,並且擴展已有的類,通過創建子類來實現適配。
2)對象適配器 (推薦使用)
對象適配器通過組合除了滿足"用戶期待的接口"還降低了代碼間的不良耦合。
3)缺省適配器
缺省適配器模式是一種特殊的適配器模式,但這個適配器是由一個抽象類實現的,並且在抽象類中要實現目標接口中所規定的所有方法,但很多方法的實現都是空方法,而具體的子類都要繼承此抽象類。
類圖
案例與代碼
本模式用火雞冒充鴨子的案例來做示例
類適配器解決方案:
類圖:
鴨子接口:
public interface Duck {
public void quack();
public void fly();
}
public class GreenHeadDuck implements Duck {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println(" Ga Ga");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a long distance");
}
}
public interface Turkey {
public void gobble();
public void fly();
}
火雞實現類:
public class WildTurkey implements Turkey {
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println(" Go Go");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a short distance");
}
}
適配器類:
public class TurkeyAdapter extends WildTurkey implements Duck {
@Override
public void quack() {
// TODO Auto-generated method stub
super.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
super.fly();
super.fly();
super.fly();
}
}
public class MainTest {
public static void main(String[] args) {
Duck duck2turkeyAdapter=new TurkeyAdapter();
duck2turkeyAdapter.quack();
duck2turkeyAdapter.fly();
}
}
對象適配器解決方案:
類圖:
適配器類:
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey)
{
this.turkey=turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
for(int i=0;i<6;i++)
{
turkey.fly();
}
}
}
對象適配器和類適配器使用了不同的方法實現適配,對象適配器使用組合,類適配器使用繼承。
使用場景
類適配器與對象適配器的使用場景一致,二者主要用於如下場景:
(1)想要使用一個已經存在的類,但是它卻不符合現有的接口規範,導致無法直接去訪問,這時創建一個適配器就能間接去訪問這個類中的方法。
(2)我們有一個類,想將其設計爲可重用的類(可被多處訪問),我們可以創建適配器來將這個類來適配其他沒有提供合適接口的類。
接口適配器使用場景:
(1)想要使用接口中的某個或某些方法,但是接口中有太多方法,我們要使用時必須實現接口並實現其中的所有方法,可以使用抽象類來實現接口,並不對方法進行實現(僅置空),然後我們再繼承這個抽象類來通過重寫想用的方法的方式來實現。這個抽象類就是適配器。
接口適配器代碼
目標接口:A
public interface A {
void a();
void b();
void c();
void d();
void e();
void f();
}
適配器:Adapter
public abstract class Adapter implements A {
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
public void f(){}
}
實現類:Ashili
public class Ashili extends Adapter {
public void a(){
System.out.println("實現A方法被調用");
}
public void d(){
System.out.println("實現d方法被調用");
}
}