適配器模式:將一個類的接口轉換爲客戶指望的另外一個接口。適配器讓本來接口不兼容的類能夠合做無間。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
用法:this
備註:OrangeBag和AppleBag都是已有類,是系統已有方法。整個過程只須要新增一個適配器類,去充當OrangeBag的實現。spa
這個適配器模式充滿良好的OO設計原則:設計