23種設計模式之適配器模式
阿新 • • 發佈:2018-01-06
img 子接口 super end interface bubuko height 多重繼承 內部
現實中的例子比如各國國標的插座與插頭關系,其中轉換器就充當了適配器作用
適配器模式:將一個類的接口轉換成另一種接口,讓原本不兼容的類可以兼容
就是兩個接口本來沒有關系,通過一個適配器類實現某個接口,可以實現另一接口的方法
1、對象適配器
火雞冒充鴨子例子:火雞有火雞接口,鴨子有鴨子接口,現在想讓鴨子有火雞的功能,但是對外部看來還是鴨子功能
public interface Turkey { void gobble(); void fly(); }interface Turkey火雞接口
public interface Duck { void quack();interface Duck鴨子接口void fly(); }
public class WildTurkey implements Turkey { public void gobble() { System.out.println(" Go Go "); } public void fly() { System.out.println("I am flying a short distance"); } }WildTurkey implements Turkey
public class GreenHeadDuck implementsGreenHeadDuck implements DuckDuck { public void quack() { System.out.println(" Ga Ga "); } public void fly() { System.out.println("I anm flying a long distance"); } }
鴨子有火雞功能,就要有個火雞適配器繼承鴨子接口(內部傳入的是火雞對象,所以屬於對象適配器)
/** * 實現Duck接口,對外看似鴨子,內部實現卻是火雞 */ public class TurkeyAdapter implementsTurkeyAdapter implements DuckDuck { private Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } public void quack() { turkey.gobble(); } public void fly() { for (int i = 0; i < 6; i++) { turkey.fly(); } } }
public class MainTest { public static void main(String[] args){ GreenHeadDuck greenHeadDuck=new GreenHeadDuck(); WildTurkey wildTurkey=new WildTurkey(); Duck duckTurkeyAdapter=new TurkeyAdapter(wildTurkey); wildTurkey.gobble(); wildTurkey.fly(); greenHeadDuck.quack(); greenHeadDuck.fly(); duckTurkeyAdapter.quack(); duckTurkeyAdapter.fly(); } }測試代碼
2、類適配器
類適配器:通過多重繼承目標接口和被適配者類方式來實現適配
多重繼承,其中繼承的目標接口部分達到適配目的,而繼承被適配者類的部分達到通過調用被適配者類裏的方法來實現目標接口的功能
TurkeyAdapter繼承自目標接口Duck,達到適配目的,然後繼承WildTurkey被適配者類,調用被適配者類內方法達到實現目標接口的功能
public class TurkeyAdapter2 extends WildTurkey implements Duck { public void quack() { super.gobble(); } @Override public void fly() { super.fly(); super.fly(); super.fly(); } }TurkeyAdapter2 extends WildTurkey implements Duck
public class MainTest { public static void main(String[] args){ GreenHeadDuck greenHeadDuck=new GreenHeadDuck(); WildTurkey wildTurkey=new WildTurkey(); Duck duckTurkeyAdapter=new TurkeyAdapter(wildTurkey); wildTurkey.gobble(); wildTurkey.fly(); greenHeadDuck.quack(); greenHeadDuck.fly(); duckTurkeyAdapter.quack(); duckTurkeyAdapter.fly(); Duck duckTurkeyAdapter2=new TurkeyAdapter2(); duckTurkeyAdapter2.quack(); duckTurkeyAdapter2.fly(); } }測試代碼
對象適配器和類適配器使用了不同的方法實現適配,對象適配器使用組合,類適配器使用繼承;組合比繼承靈活,所以建議使用對象適配器
23種設計模式之適配器模式