适配器模式

来源:互联网 发布:windows 32位升级64位 编辑:程序博客网 时间:2024/06/06 02:05

适配器模式可以将一个类的接口转换成客户希望的另一个接口。当然,前提是这个类有能力实现客户希望的那些功能,否则转换毫无意义。

现假设有一个Duck接口,它只要两个方法,定义如下:

package Adaptor;/** * Created by sgzhang on 2015/8/17. */public interface Duck {    void quack();    void fly();}

但是手上只有一只Turkey。它的代码如下:

//首先是Turkey的接口

package Adaptor;/** * Created by sgzhang on 2015/8/17. */public interface Turkey {    void gobble();    void fly();
//MallarTurkey是Turkey的一种,代码如下:

package Adaptor;/** * Created by sgzhang on 2015/8/17. */public class MallarTurkey implements Turkey {    @Override    public void gobble() {        System.out.println("咕咕叫!");    }    @Override    public void fly() {        System.out.println("飞一点点远!");    }}
我们需要用一只Turkey去冒充Duck,因此要将Turkey的方法适配成Duck的方法。

首先是叫,Duck的是quack(),显然只需要在适配器中的quack()方法内调用gobble()就可以了。

接着是飞,Duck和Turkey都有这个方法,所不同的是鸭子飞一次是土鸡飞一次距离的5倍,为了让伪装不露馅,我们让土鸡飞五次。

package Adaptor;/** * Created by sgzhang on 2015/8/17. */public class TurkeyAdaptor implements Duck{    Turkey turkey;    public TurkeyAdaptor(Turkey turkey) {        this.turkey=turkey;    }    @Override    public void quack() {        turkey.gobble();    }    @Override    public void fly() {        for(int i=0;i<5;i++){            turkey.fly();        }        System.out.println("飞了5次就和鸭子飞一次那么远了,嘿嘿!");    }

可以看到该适配器内部有一个Turkey的引用,在适配器的构造方法中得以指定所指。

最后是测试程序:

package Adaptor;/** * Created by sgzhang on 2015/8/17. */public class AdaptorTest {    public static void main(String[] args){        //需要一只Duck但是现在只有Turkey,为了交差只能用土鸡去冒充鸭子了        Duck aDuck=new TurkeyAdaptor(new MallarTurkey());        aDuck.fly();        aDuck.quack();        System.out.println("调用者:这是一只好鸭子!");    }}








0 0