现实中的例子比如各国国标的插座与插头关系,其中转换器就充当了适配器作用
适配器模式:将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容
就是两个接口本来没有关系,通过一个适配器类实现某个接口,可以实现另一接口的方法
1、对象适配器
火鸡冒充鸭子例子:火鸡有火鸡接口,鸭子有鸭子接口,现在想让鸭子有火鸡的功能,但是对外部看来还是鸭子功能
public interface Turkey { void gobble(); void fly(); }
public interface Duck { void quack(); 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"); } }
public class GreenHeadDuck implements Duck { public void quack() { System.out.println(" Ga Ga "); } public void fly() { System.out.println("I anm flying a long distance"); } }
鸭子有火鸡功能,就要有个火鸡适配器继承鸭子接口(内部传入的是火鸡对象,所以属于对象适配器)
/** * 实现Duck接口,对外看似鸭子,内部实现却是火鸡 */ public class TurkeyAdapter implements Duck { 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(); } }
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(); } }
对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承;组合比继承灵活,所以建议使用对象适配器