设计模式:适配器模式

  适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不见人的类可以合作无间。

  在生活中,一个二插转换器就是一个适配器,本来不能将二插的插头插入三插插口,利用了这个转换器就可以实现,这个二插转换器在中间起到了一端连接插座,一端连接插头的作用。

  场景:之前我们看过鸭子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:客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

  好了,这就是简单的适配器例子了。

 

  下一节:外观模式

posted @ 2017-03-07 11:46  哀&RT  阅读(173)  评论(0编辑  收藏  举报