聚合支付系统中用到的配器模式详细剖析与释义

一、概述

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
——《设计模式:可复用面向对象软件的基础》

在这里插入图片描述

如果有一天,你的上级领导一拍脑门。说为什么我们不让汽车可以在铁轨上跑呢? 我感觉这个方向国内还没有人做过,这个方向一旦打通,不得了。又是一片蓝海,到时候,哈哈哈哈哈哈哈。

聪明的你,一下子想到了领导这无厘头的想法是个屁。但是,一想到昨天晚上趁着酒兴怼了领导几句,而领导今天没有由于你左脚踏进公司扣奖金。估摸着,这次如果不顺着领导,估计这个月的奖金…Oops.

于是一拍脑门:“领导,妙!”

整个项目组火急火燎的工作了起来…


我们将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作

适配器模式分为类适配器模式对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

二、结构定义

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

三、适配器模式定义

下面我们来看看这两种适配器模式的定义

3.1 类适配器模式

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件
我们通过一个例子来说明:
【例】读卡器
现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。
在这里插入图片描述
代码如下:

//SD卡的接口
public interface SDCard {
    //读取SD卡方法
    String readSD();
    //写入SD卡功能
    void writeSD(String msg);
}//SD卡实现类
public class SDCardImpl implements SDCard {
    public String readSD() {
        String msg = "sd card read a msg :hello word SD";
        return msg;
    }public void writeSD(String msg) {
        System.out.println("sd card write msg : " + msg);
    }
}//电脑类
public class Computer {public String readSD(SDCard sdCard) {
        if(sdCard == null) {
            throw new NullPointerException("sd card null");
        }
        return sdCard.readSD();
    }
}//TF卡接口
public interface TFCard {
    //读取TF卡方法
    String readTF();
    //写入TF卡功能
    void writeTF(String msg);
}//TF卡实现类
public class TFCardImpl implements TFCard {public String readTF() {
        String msg ="tf card read msg : hello word tf card";
        return msg;
    }public void writeTF(String msg) {
        System.out.println("tf card write a msg : " + msg);
    }
}//定义适配器类(SD兼容TF)
public class SDAdapterTF extends TFCardImpl implements SDCard {public String readSD() {
        System.out.println("adapter read tf card ");
        return readTF();
    }public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        writeTF(msg);
    }
}//测试类
public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.readSD(sdCard));System.out.println("------------");SDAdapterTF adapter = new SDAdapterTF();
        System.out.println(computer.readSD(adapter));
    }
}

可以看出来,这种方式在编译时实现target(目标)接口。这种适配器模式使用了**多个实现了期待的接口或者已经存在的接口的多态接口。**比较典型的就是:target接口被创建为一个纯粹的接口,如Java不支持多继承的语言
在这里插入图片描述
但是,类适配器模式违背了合成复用原则。并且类适配器是客户类有一个接口规范的情况下可用,反之不可用。

3.2 对象适配器模式

和上述类适配器不同的是:对象适配器模式在运行时实现target(目标)接口。在这种适配器模式中,适配器包装了一个类实例。在这种情况下,适配器调用包装对象实例的方法
在这里插入图片描述
【例】读卡器

我们使用对象适配器模式将读卡器的案例进行改写。类图如下:
在这里插入图片描述
代码如下:

类适配器模式的代码,我们只需要修改适配器类(SDAdapterTF)和测试类。

//创建适配器对象(SD兼容TF)
public class SDAdapterTF  implements SDCard {private TFCard tfCard;public SDAdapterTF(TFCard tfCard) {
        this.tfCard = tfCard;
    }public String readSD() {
        System.out.println("adapter read tf card ");
        return tfCard.readTF();
    }public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        tfCard.writeTF(msg);
    }
}//测试类
public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.readSD(sdCard));System.out.println("------------");TFCard tfCard = new TFCardImpl();
        SDAdapterTF adapter = new SDAdapterTF(tfCard);
        System.out.println(computer.readSD(adapter));
    }
}

3.3 接口适配器模式

当不需要全部实现接口提供的方法时,可以设计一个适配器抽象类实现接口,并为接口中的每个方法提供默认方法,抽象类的子类就可以有选择的覆盖父类的某些方法实现需求,它适用于一个接口不想使用所有的方法的情况。

但是,在Java8之后,接口中可以有default方法,就不需要这样的缺省适配器模式了。所以,可以看到很多架构在到Java-8之后,xxxAdapter标记为过时。

类图如下所示:
在这里插入图片描述
适配器Adapter类实现Target接口,方法默认为空。具体的代码示例,可以在文后看代码仓库中的代码。

四、应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

客户端需要一个target(目标)接口,但是不能直接重用已经存在的adaptee(适配者)类,因为它的接口和target接口不一致,所以需要adapter(适配器)将adaptee转换为target接口。前提是target接口和已存在的适配者adaptee类所做的事情是相同或相似,只是接口不同且都不易修改。如果在设计之初,最好不要考虑这种设计模式。凡事都有例外,就是设计新系统的时候考虑使用第三方组件,因为我们就没必要为了迎合它修改自己的设计风格,可以尝试使用适配器模式。

最典型的有我们的:

五、总结

本文主要介绍了三种适配器模式,本质上是现有的不兼容的接口转换为需要的接口。

  • 类适配器模式:以继承现有类的方式转换。

  • 对象适配器模式: 以聚合对象实例的方式转换。

  • 接口适配器模式:以实现接口的方式转换。

适配器模式是在现有的类和系统都不易修改的情况下使用,在系统设计之初慎用适配器模式。

本篇博文完整的代码已提交到GitHub仓库中:适配器模式(Adapter Pattern) GitHub Link


参考:

https://zhuanlan.zhihu.com/p/163616628

https://refactoringguru.cn/design-patterns/adapter

添加链接描述


由于本人水平有限,如果本文有什么错漏,请不吝赐教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值