设计模式7——适配器模式

如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了


1 定义

1.1 概念

将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
适配器模式就如同它本身的名字一样形象,如图1:现有系统暴露的接口与厂商类的接口不匹配,二者不能结合使用。
在这里插入图片描述
现在需要一个适配器来将两个系统结合起来。如图2:
在这里插入图片描述

1.2 类图

适配器模式分为两种:对象适配器和类适配器。

  1. 对象适配器:让适配器类Adapter去实现目标接口Target,适配器类Adapter和被适配者Adaptee进行组合。而客户此时只看到目标接口。
    在这里插入图片描述
  2. 类适配器:因为java是不支持多继承的,所以在这里把类图放在这仅供参考不做解释了。
    在这里插入图片描述

2.例子

2.1类图

如图5:有鸭子接口Duck和火鸡Turkey接口,有时候需要让火鸡充当鸭子,所以就有了TurkeyAdapter类实现了Duck接口,在TurkeyAdapter中通过调用Turkey的方法让其适配鸭子接口。也有时候要让鸭子充当火鸡,做法和之前的类似。 MallardDuckWildTurkey分别是DuckTurkey的实例,用来和适配器类做对比。其他两个DuckTestDriveTurkeyTestDrive是测试类。
在这里插入图片描述

2.2代码

(1) 火鸡充当鸭子

public interface Duck {
    void quack();
    void fly();
}

public class MallardDuck implements  Duck{
    public void quack() {
        System.out.println("Quack");
    }

    public void fly() {
        System.out.println("I'm flying");
    }

}

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();
        }
    }
}

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();
    }
}

(2) 鸭子充当火鸡

public interface Turkey {
    void gobble();
    void fly();

}

public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    public void fly() {
        System.out.println("I'm flying a short distance");
    }

}

public class DuckAdapter implements Turkey{
    Duck duck;
    Random rand;

    public DuckAdapter(Duck duck) {
        this.duck = duck;
        rand = new Random();
    }

    public void gobble() {
        duck.quack();
    }

    public void fly() {
        if (rand.nextInt(5)  == 0) {
            duck.fly();
        }
    }
}

public class TurkeyTestDrive {
    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();
        Turkey duckAdapter = new DuckAdapter(duck);

        for (int i = 0; i < 10; i++) {
            System.out.println("The DuckAdapter says...");
            duckAdapter.gobble();
            duckAdapter.fly();
        }
    }
}

发布了35 篇原创文章 · 获赞 4 · 访问量 2505

猜你喜欢

转载自blog.csdn.net/weixin_41938180/article/details/104349433