天天看點

Java設計模式:擴充卡模式(Adapter Pattern)

擴充卡模式定義

擴充卡模式将一個類的接口,轉換成客戶期望的另一個接口。擴充卡讓原本接口不相容的類可以合作無間。

擴充卡有兩種類型:對象擴充卡、類擴充卡

對象擴充卡

UML類圖

Java設計模式:擴充卡模式(Adapter Pattern)

類擴充卡

UML類圖

Java設計模式:擴充卡模式(Adapter Pattern)

個人認為兩者的優劣勢

對象擴充卡:

使用組合,不僅可以适配某個類,也可以适配該類的任何子類,一般而言,是單向的适配;

類擴充卡(注:Java中沒有多重繼承):

使用繼承,不好擴充到别的子類,但可以雙向适配;

采用對象擴充卡的代碼

Duck.java

public interface Duck {

  public void quack();
  public void fly();
}      

MallarDuck.java

public class MallardDuck implements Duck {

  public void quack() {
    // TODO Auto-generated method stub
    System.out.println("MallacDuck Quack");
  }

  public void fly() {
    // TODO Auto-generated method stub
    System.out.println("MallacDuck is flying");
  }
}      

Turkey.java

public interface Turkey {

  public void gobble();
  public void fly();
}      

WildTurkey.java

public class WildTurkey implements Turkey {

  public void gobble() {
    // TODO Auto-generated method stub
    System.out.println("WildTurkey gobble");
  }

  public void fly() {
    // TODO Auto-generated method stub
    System.out.println("WildTurkey is flying a short distance");
  }
}      

讓火雞适配鴨子

TurkeyAdapter.java

public class TurkeyAdapter implements Duck {

  Turkey turkey;
  
  public TurkeyAdapter(Turkey turkey){
    this.turkey = turkey;
  }
  
  public void quack() {
    // TODO Auto-generated method stub
    turkey.gobble();
  }

  public void fly() {
    // TODO Auto-generated method stub
    turkey.fly();
  }
}      

現在做一個鴨子類接口測試,但想用火雞了

DuckTest.java

public class DuckTest {

  public static void main(String[] args) {
    MallardDuck duck = new MallardDuck();
    testDuck(duck);
    
    System.out.println("--------------------");
    WildTurkey turkey = new WildTurkey();
    turkey.gobble();
    turkey.fly();
    
    System.out.println("--------------------");
    Duck turkeyAdapter = new TurkeyAdapter(turkey);
    testDuck(turkeyAdapter);
    
  }
  
  static void testDuck(Duck duck){
    duck.quack();
    duck.fly();
  }
}      

輸出

MallacDuck Quack
MallacDuck is flying
--------------------
WildTurkey gobble
WildTurkey is flying a short distance
--------------------
WildTurkey gobble
WildTurkey is flying a short distance      

現在又做火雞測試類,但又想能用鴨子,是以還要寫一個能适配火雞的鴨子擴充卡

DuckAdapter.java

public class DuckAdapter implements Turkey {

  Duck duck;
  
  public DuckAdapter(Duck duck){
    this.duck = duck;
  }
  
  public void gobble() {
    // TODO Auto-generated method stub
    duck.quack();
  }

  public void fly() {
    // TODO Auto-generated method stub
    duck.fly();
  }

}      

開始測試

public class TurkeyTest {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    MallardDuck duck = new MallardDuck();
    Turkey duckAdapter = new DuckAdapter(duck);
    
    duckAdapter.gobble();
    duckAdapter.fly();
  }

}      
MallacDuck Quack
MallacDuck is flying      

繼續閱讀