1.6_適配器模式

適配器模式有三種:類適配器、對象適配器、接口適配器(缺省適配器)
 
  1. 類適配器:
• Target: 定義Client使用的與特定領域相關的接口。
• Client: 與符合Target接口的對象協同。
• Adaptee: 定義一個已經存在的接口,這個接口需要適配。
• Adapter: 對Adaptee的接口與Target接口進行適配
例如安卓數據線正常使用的話,就只能給安卓手機充電,但是想要給小米手機充電的話,就必須用安卓數據線適配一個Type-C口才能給小米手機充電。
package co.xiaowenzi.study.single;
// Target: 安卓數據線
public interface Android interface {
   public void powerAndroidPhone();
}
 
package co.xiaowenzi.study.single;
public class AndroidPhone implements Android interface {
   @Override
   public void powerAndroidPhone() {
      System.out.println("Android數據線正常使用,給安卓手機充電");
   }
}
 
package co.xiaowenzi.study.single;
//Adaptee: 定義一個已經存在的TypeC口,這個口需要適配。
public class TypeC {
   public void powerXiaomiPhone() {
      System.out.println("Android數據線接上TypeC口,給小米手機充電");
   }
}
 
package co.xiaowenzi.study.single;
//Adapter: 安卓數據線接上Type-C接口給小米手機充電
public class TypeCAdapter extends TypeC implements Android interface {
   @Override
   public void powerAndroidPhone() {
      super.powerXiaomiPhone();
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      // 安卓手機充電
      Android interface concreteTarget = new AndroidPhone();
      concreteTarget.powerAndroidPhone();
 
      // 小米手機充電
      Android interface adapter = new TypeCAdapter();
      adapter.powerAndroidPhone();
   }
}
 
  1. 對象適配器:
把類適配器裏面繼承的方法,改爲類對象,然後對象實現具體的方法
package co.xiaowenzi.study.single;
 
//Adapter: 安卓數據線接上Type-C接口給小米手機充電
public class TypeCAdapter implements Android interface {
   private TypeC mTypeC;
   
   public TypeCAdapter(TypeC typeC) {
      this.mTypeC = typeC;
   }
   
   @Override
   public void powerAndroidPhone() {
      mTypeC.powerXiaomiPhone();
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      // 安卓手機充電
      Android interface concreteTarget = new AndroidPhone();
      concreteTarget.powerAndroidPhone();
 
      // 小米手機充電
      Android interface adapter = new TypeCAdapter(new TypeC());
      adapter.powerAndroidPhone();
   }
}
測試結果與上面的一致。修改的只就是 Adapter 類的內部結構,即 Adapter 自身必須先擁有一個被適配類的對象,再把具體的特殊功能委託給這個對象來實現。使用對象適配器模式,可以使得 Adapter 類(適配類)根據傳入的 Adaptee 對象達到適配多個不同被適配類的功能,當然,此時我們可以爲多個被適配類提取出一個接口或抽象類。這樣看起來的話,似乎對象適配器模式更加靈活一點。
 
  1. 接口適配器
原理:通過抽象類來實現適配,這種適配稍別於上面所述的適配。
package co.xiaowenzi.study.single;
public interface Porwer interface {
    void powerAndroidPhone();
    void powerXiaomiPhone();
}
 
package co.xiaowenzi.study.single;
public class PhoneAdapter implements Porwer interface {
   @Override
   public void powerAndroidPhone() {
   }
 
   @Override
   public void powerXiaomiPhone() {
   }
}
 
package co.xiaowenzi.study.single;
public class Phone extends PhoneAdapter{
   public void powerAndroidPhone() {
      System.out.println("給安卓手機充電");
   }
 
   public void powerXiaomiPhone() {
      System.out.println("給小米手機充電");
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      Phone phone = new Phone();
      phone.powerAndroidPhone();
      phone.powerXiaomiPhone();
   }
}
當存在這樣一個接口,其中定義了許多的方法,而現在卻只想使用其中的一個到幾個方法,如果直接實現接口,那麼要對所有的方法進行實現,哪怕僅僅是對不需要的方法進行置空(只寫一對大括號,不做具體方法實現)也會導致這個類變得臃腫,調用也不方便,這時可以使用一個抽象類作爲中間件,即適配器,用這個抽象類實現接口,而在抽象類中所有的方法都進行置空,那麼在創建抽象類的繼承類,而且重寫需要使用的那幾個方法即可。
適配器模式優點 
1.更好的複用性:系統需要使用現有的類,而此類的接口不符合系統的需要。那麼通過適配器模式就可以讓這些功能得到更好的複用。
2.更好的擴展性:在實現適配器功能的時候,可以擴展自己源的行爲(增加方法),從而自然地擴展系統的功能。
適配器模式缺點 
會導致系統紊亂:濫用適配器,會讓系統變得非常零亂。
例如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,導致代碼運行混亂且難查出原因。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章