适配器模式

来源:互联网 发布:中国网络作家数量 编辑:程序博客网 时间:2024/06/16 14:25

定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

引用Head First设计模式上的场景:客户一直和Duck接口(目标接口)打交道,会用到一些Duck对象,如果Duck对象不够,就拿一些Turkey对象来凑。但是客户不能直接使用Turkey对象,需要转换一下,变成一个看起来像Duck的Turkey。

一个小例子:
(1)创建一个Target接口Duck.java

//目标接口public interface Duck {    public void quack();    public void fly();}

(2)创建一个类MallardDuck实现Duck接口,这个类是真正的Duck。

/** * 绿头鸭 */public class MallardDuck implements Duck {    public void quack() {        System.out.println("鸭子“嘎嘎”叫");    }    public void fly() {        System.out.println("鸭子飞飞飞");    }}

(3)创建一个要适配的接口Turkey.java

public interface Turkey { // 要适配的接口    public void gobble();    public void fly();}

(4)创建一个类实现Turkey接口,这是真正的Turkey。

/** * 野火鸡 */public class WildTurkey implements Turkey {    public void gobble() {        System.out.println("野火鸡“咕咕”叫");    }    public void fly() {        System.out.println("野火鸡飞飞飞");    }}

(5)创建一个适配器TurkeyAdapter.java,实现Duck接口,使TurkeyAdapter“是一个”Duck,并且在类中传入要适配的对象的引用,这里用构造方法获得。

public class TurkeyAdapter implements Duck {    Turkey turkey;    public TurkeyAdapter(Turkey turkey) {        this.turkey = turkey;    }    public void quack() {        turkey.gobble();    }    public void fly() {        for(int i=0; i < 5; i++) {            turkey.fly();        }    }}

(4)创建测试类

public class DuckTestDrive {    public static void main(String[] args) {        MallardDuck duck = new MallardDuck();//创建鸭子对象        WildTurkey turkey = new WildTurkey();//创建火鸡对象        Duck turkeyAdapter = new TurkeyAdapter(turkey);        System.out.println("火鸡动作------------------");        turkey.gobble();        turkey.fly();        System.out.println("鸭子动作------------------");        testDuck(duck);        System.out.println("经过适配器适配变成鸭子的火鸡------------");        testDuck(turkeyAdapter);    }    static void testDuck(Duck duck) {        duck.quack();        duck.fly();    }}

输出:

火鸡动作------------------野火鸡“咕咕”叫野火鸡飞飞飞鸭子动作------------------鸭子“嘎嘎”叫鸭子飞飞飞经过适配器适配变成鸭子的火鸡-------------------野火鸡“咕咕”叫野火鸡飞飞飞

从输出我们可以知道,客户已经可以使用被适配成鸭子的火鸡对象了。
上面的关系用图来表示如下:
这里写图片描述

小结:
创建适配器的原则就是:要适配成什么目标对象,就实现这个目标接口,要适配什么对象,就传入这个对象的引用,然后在实现目标接口的方法中调用被适配的对象的方法。这里就是:要适配成Duck目标对象,就实现Duck接口,要适配的对象是Turkey,就传入Turkey的引用(这里通过构造方法获得),然后在目标接口方法中调用Turkey对象的方法。

原创粉丝点击