深入理解设计模式-适配器模式


一、什么是适配器模式

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

适配器模式主要角色:

  • Target(目标抽象类): 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类
  • Adaptee(适配者类): 适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码
  • Adapter(适配器类): 适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系

适配器模式分类:

  • 对象适配器模式:在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体
  • 类适配器模式: 这种适配器模式下,适配器继承自已实现的类(一般多重继承)

二、样例分析

假设你缺鸭子对象,想用火鸡对象来冒充,显然,因为火鸡的接口不同,不能公然拿来用,需要写个适配器来实现。
在这里插入图片描述

/**
 * Target(目标抽象类)
 */
public interface Duck {
    public void quack();

    public void fly();
}

/**
 * Target(目标实现类)
 */
public class MallardDuck implements Duck{
    @Override
    public void quack() {
        System.out.println("Quack");
    }

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

/**
 * Adaptee(适配者抽象类)
 */
public interface Turkey {
    public void gobble();

    public void fly();
}

/**
 * Adaptee(适配者实现类)
 */
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");
    }
}


/**
 * Adapter(适配器类)
 */
public class TurkeyAdapter implements Duck{
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        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();
    }
}

三、优缺点

优点:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握

四、使用场景

  • 想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式

五、类和对象适配器对比

在这里插入图片描述
类适配器模式是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系。由于对象适配器符合合成复用原则,所以它比类适配器模式更加灵活。


结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xd聊架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值