适配器模式

来源:互联网 发布:dive into python 2 编辑:程序博客网 时间:2024/06/05 06:41

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

类图

这里写图片描述

java代码

// 鸭子接口public interface Duck {    void quack();  // 呱呱叫    void fly();}// 绿头鸭public class MallardDuck implements Duck {    @Override    public void quack() {        System.out.println("quack ~~~");    }    @Override    public void fly() {        System.out.println("fly ~~~");    }}// 火鸡接口public interface Turkey {    void gobble();  // 咯咯叫    void flyShortDistance();}// 野火鸡public class WildTurkey implements Turkey {    @Override    public void gobble() {        System.out.println("gobble ~~~");    }    @Override    public void flyShortDistance() {        System.out.println("fly short distance ~~~");    }}// 装饰器,将火鸡伪装成一只鸭子public class TurkeyAdapter implements Duck {    private Turkey turkey;    public TurkeyAdapter(Turkey turkey) {        this.turkey = turkey;    }    @Override    public void quack() {        turkey.gobble();    }    @Override    public void fly() {        for (int i = 0; i < 5; i++) {            // 火鸡飞的距离比较短,我们让他飞5次,这样看起来更像是一只鸭子            turkey.flyShortDistance();        }    }}// 测试类public class Test {    public static void main(String[] args) {        new Test().test();    }    private void test() {        // 火鸡        Turkey wildTurkey = new WildTurkey();        wildTurkey.gobble();        wildTurkey.flyShortDistance();        // 鸭子        Duck mallardDuck = new MallardDuck();        testDuck(mallardDuck);        // 伪装成鸭子的火鸡        Duck duck = new TurkeyAdapter(wildTurkey);        testDuck(duck);    }    private void testDuck(Duck duck) {        duck.quack();        duck.fly();    }}

注:

  • 现在我们可以把火鸡当成鸭子用了。。。
  • 适配器模式需要区别于外观模式(可参考我的另一篇文章),两者目的不同
    适配器模式:伪装接口符合客户的期望
    外观模式:提供子系统的一个简化接口

类适配器

适配器有两种模式,上面示例属于对象适配器。我们通过实现Duck接口,组合WildTurkey类创建了一个适配器。
还有一种是类适配器。我们可以通过继承Turkey和Duck类来创建适配器,Turkey和Duck是具体类,不再是接口。恨遗憾java不支持多重继承,所以无法演示。

参考文章
1. Head First 设计模式

0 0
原创粉丝点击