适配器模式

来源:互联网 发布:ubuntu灰色壁纸 编辑:程序博客网 时间:2024/06/05 21:58

适配器模式:当需要使用一个现有的类而其接口不符合你的需要时,就需要使用适配器。将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。


举个栗子:

现在,假设你缺鸭子对象,想要用一些火鸡对象来冒充。显而易见,因为火鸡的接口不同,所以我们不能公然拿来用,所以,就写个适配器吧:

 

鸭子接口:

Duck.java 类:

/** *  鸭子接口 */public interface Duck {    public void quack(); // 具备呱呱叫    public void fly();   // 具备飞行能力}

鸭子具体实现:

MallardDuck.java 类:
public class MallardDuck implements Duck {    @Override    public void quack() {        System.out.println("Quack");    }    @Override    public void fly() {        System.out.println("I'm flying");    }}

火鸡接口:

Turkey.java 类:
/** *  火鸡接口 */public interface Turkey {    public void gobble();   // 火鸡不会呱呱叫,只会咯咯叫    public void fly();      // 火鸡会飞,但飞不远}

火鸡具体实现类:

WildTurkey.java 类:

/** *  火鸡的一种具体实现 */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");    }}

假如现在,我们缺少鸭子的具体实现类MallardDuck.java,因此,我们需要用火鸡WildTurkey去冒充鸭子,因此,实现的适配器如下:

TurkeyAdapter.java 类:
public class TurkeyAdapter implements Duck {    Turkey turkey;    public TurkeyAdapter(Turkey turkey) {        this.turkey = turkey;    }    @Override    public void quack() { // 这里用火鸡的咯咯,冒充鸭子的嘎嘎        turkey.gobble();    }    @Override    public void fly() { // 火鸡的飞行距离很近,要让鸭子的飞行和火鸡的飞行能够对应,必须连续5次调用火鸡的fly()        for(int i = 0; i<5;i++) {            turkey.fly();        }    }}

编写一个测试类:

DuckTestDrive.java 类:

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("The Turkey says...");        turkey.gobble();        turkey.fly();        System.out.println("\nThe Duck says...");        testDuck(duck);        System.out.println("\nThe TurkeyAdapter says...");        testDuck(turkeyAdapter);    }    static void testDuck(Duck duck) {        duck.quack();        duck.fly();    }}

分析:

1、针对接口编程,而不针对具体的实现编程,因此,看到我们都是用接口去调用具体的实现类。

2、适配器的基本核心,其实就是写了一个适配器类实现需要适配的接口,然后把需要适配的接口当成字段,写一个构造器将该接口具体的实现传给该接口,然后适配器中去实现适配的接口的各个方法即可。
原创粉丝点击