设计模式之适配器模式

适配器模式

定义:An adapter allows two incompatible interfaces to work together. This is the real-world definition for an adapter. Interfaces may be incompatible, but the inner functionality should suit the need. The adapter design pattern allows otherwise incompatible classes to work together by converting the interface of one class into an interface expected by the clients.

适配器模式用于适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类
可以一起工作 。

实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
代码演示:
public interface ITarget {
    void f1();
    void f2();
    void fc();
}

public class Adaptee {
    public void fa() {

    }

    public void fb() {

    }

    public void fc() {

    }
}
类适配器:
public class Adaptor extends Adaptee implements ITarget {
    @Override
    public void f1() {
        System.out.println("f1");
        super.fa();
    }

    @Override
    public void f2() {
        System.out.println("f2");
    }

    // 这里fc()不需要实现,直接继承自Adaptee,这是跟对象适配器最大的不同点
}
接口适配器:
public class Adaptor implements ITarget {
    private Adaptee adaptee;

    public Adaptor(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void f1() {
        System.out.println("f1");
        adaptee.fa();
    }

    @Override
    public void f2() {
        adaptee.fb();
        System.out.println("f2");
    }

    @Override
    public void fc() {
        adaptee.fc();
    }
}

两种实现方式选择标准:

  • Adaptee 接口的个数
  • Adaptee 和 ITarget 的契合程度

如果 Adaptee 接口并不多,那两种实现方式都可以。
如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都相同,那我们推荐使用类适配器, Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都不相同,推荐使用对象适配器,组合结构相对于继承更加灵活。

适配器模式应用场景总结

封装有缺陷的接口设计

依赖的外部系统在接口设计方面有缺陷(比如包含大量静态方法),引入之后会影响到自身代码的可测试性。为了隔离设计上的缺陷,可以对外部系统提供的接口进行二次封装,抽象出更好的接口设计,这个时候就可以使用适配器模式 。

统一多个类的接口设计

某个功能的实现依赖多个外部系统(或者说类)。通过适配器模式,将它们的接口适配为统
一的接口定义,然后我们就可以使用多态的特性来复用代码逻辑 。

替换依赖的外部系统
兼容老版本接口
适配不同格式的数据

典型应用场景:Slf4j ,既可以使用log4j/log4j2,又可以使用logback打印日志,通过适配器实现日志打印。

代理、桥接、装饰器、适配器 4 种设计模式的区别

代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。

桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。

装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。

适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理
模式、装饰器模式提供的都是跟原始类相同的接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值