設計模式之適配器模式

適配器模式:將一個類的接口轉換爲客戶指望的另外一個接口。適配器讓本來接口不兼容的類能夠合做無間。app

場景:水果店賣有橘子和蘋果,橘子用橘子包裝盒,蘋果用蘋果包裝盒,顧客A來買橘子,可是沒有橘子包裝盒了,則用蘋果包裝盒暫時替代一下。ide

/**
 * 桔子
 * 
 */
public class Orange implements Fruit {
    private String name = "";
    private int price = 70;

    public Orange(String name,int price){
        this.price = price;
        this.name = name;
    }

    public void pack(OrangeBag bag){
        bag.pack();
    }

    @Override
    public int price() {
        return price;
    }

    @Override
    public void draw() {
        System.out.print("砂糖桔");
    }

    public int accept(Visit visit){
        return visit.sell(this);
    }

    public void setPrice(int price) {
        this.price = price;
    }
}



  /**
 * 桔子包裝
 * 
 */
public class OrangeBag implements Bag {
    @Override
    public void pack() {
        System.out.print("--桔子使用網兜包裝");
    }
}


 /**
 * 蘋果包裝
 * Created by Peter on 10/9 009.
 */
public class AppleBag implements Bag {
    @Override
    public void pack() {
        System.out.print("--蘋果使用紙箱包裝");
    }
}



 /**
 * 水果接口
 */
public interface Fruit {

    int price();

    void draw();

    int accept(Visit visit);

}

/**
 * 包裝接口
 */
public interface Bag {

    void pack();

}

測試代碼以下: main方法裏面,new一個橘子,再獲取一個橘子包裝實例。
現在橘子包裝沒了,用蘋果包裝代替一下。測試

public class AdapterClient {
    public static void main(String[] args){
        Orange orange = new Orange("peter",100);
        OrangeBag bag = getBag2();
        orange.pack(bag);
    }

    /**
     * 取桔子包裝
     * @return
     */
//    private static OrangeBag getBag(){
//        OrangeBag bag = new OrangeBag();
//        return bag;
//    }

    private static OrangeBag getBag2(){
        //準備用途蘋果盒代替
        AppleBag appleBag = new AppleBag();

        //把蘋果盒適配成桔子包裝盒
        OrangeBag orangeBag = new OrangeBagAdapter(appleBag);

        return orangeBag;
    }
}


  /**
 * 桔子包裝適配器
 */
public class OrangeBagAdapter extends OrangeBag {
    private AppleBag appleBag;

    public OrangeBagAdapter(AppleBag appleBag){
        this.appleBag = appleBag;
    }

    @Override
    public void pack() {
        appleBag.pack();
    }
}

適配器模式結構圖:ui

clipboard.png

用法:this

  • 1.OrangeBagAdapter繼承OrangeBag,同時組合AppleBag對象(引入成員變量),使OrangeBag和AppleBag產生關聯。
  • 2.當OrangeBag目標方法被調用時,OrangeBagAdapter轉調AppleBag的對象方法。

備註:OrangeBag和AppleBag都是已有類,是系統已有方法。整個過程只須要新增一個適配器類,去充當OrangeBag的實現。spa

這個適配器模式充滿良好的OO設計原則:設計

  • 1.使用了對象的組合,以修改的接口(即上文的OrangeBagAdapter的pack()方法)包裝被適配者(即上文的蘋果包裝AppleBag);
  • 2.這種作法還有額外的優勢就是被適配者的的任何子類均可以搭配着適配器使用。
相關文章
相關標籤/搜索