适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不见人的类可以合作无间。
在生活中,一个二插转换器就是一个适配器,本来不能将二插的插头插入三插插口,利用了这个转换器就可以实现,这个二插转换器在中间起到了一端连接插座,一端连接插头的作用。
场景:之前我们看过鸭子Duck类,现在我们有个火鸡,让我们通过适配器把它伪装成鸭子。
首先创建鸭子和火鸡接口
//鸭子接口 public interface Duck { //简单点,直接让鸭子具有呱呱叫和飞行能力 public void quack(); public void fly(); } //火鸡接口 public interface Turkey { //火鸡不会呱呱叫,只会咯咯叫 public void gobble(); //火鸡也能飞,但飞不远 public void fly(); }
接着实现具体的鸭子和火鸡
//实现Duck接口的具体类,绿头鸭 public class MallardDuck implements Duck{ @Override public void quack() { System.out.println("Quack"); } @Override public void fly() { System.out.println("I'm fly"); } } //实现火鸡接口的具体类 public class WildTurkey implements Turkey { @Override public void gobble() { System.out.println("Gobble gobble"); } @Override public void fly() { System.out.println("I'm flying a short distance"); } }
实现一个火鸡和鸭子连接的适配器
//实现向转换成的类型接口,也就是客户所希望看到的接口 public class TurkeyAdapter implements Duck{ Turkey turkey; //需要取得要适配的对象引用,这里为了方便直接用构造器来取得这个引用 public TurkeyAdapter(Turkey turkey){ this.turkey = turkey; } @Override public void quack() { //把火鸡的咯咯叫伪装成鸭子的quack叫声 turkey.gobble(); } @Override public void fly() { //因为火鸡飞不远,为了将火鸡的飞行伪装成鸭子的飞行,让火鸡多飞几次 for(int i=0; i<5; i++){ turkey.fly(); } } }
最后编写测试类
public class Test { public static void main(String[] args) { //创建一直鸭子和火鸡 MallardDuck duck = new MallardDuck(); WildTurkey turkey = new WildTurkey(); //将火鸡保证金一个火鸡适配配,伪装成鸭子 Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println("----Test Turkey----"); //测试真正火鸡的行为 turkey.gobble(); turkey.fly(); //测试鸭子的行为,包括伪装成鸭子的火鸡 System.out.println("----Test Duck----"); testDuck(turkeyAdapter); testDuck(duck); } public static void testDuck(Duck duck){ duck.quack(); duck.fly(); } }
运行结果如下:
下面总结下客户使用适配器的过程。
1:客户(鸭子)通过目标接口调用适配器的方法对适配器发出请求。
2:适配器使用被适配者接口(火鸡接口)把请求转换成被适配者的一个或多个调用接口(具体的火鸡接口实现类)。
3:客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
好了,这就是简单的适配器例子了。
下一节:外观模式