java设计模式系列6——适配器设计模式

适配器设计模式

见名知意,是作为两个不兼容的接口之间的桥梁,属于结构型模式

适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

常见的几类适配器

  • 类的适配器模式
    想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可

  • 对象的适配器模式
    想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行

  • 接口的适配器模式
    不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即

接口的适配器模式

场景:不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即

新建一个支付网关

public interface PayGateway {

    /**
     * 下单
     */
    void unifiedorder();

    /**
     * 退款
     */
    void refund();

    /**
     * 查询支付状态
     */
    void query();

    /**
     * 发红包
     */
    void sendRedPack();
}

场景分析:现在我有一个类,想要实现PayGateway中的两个方法,如果使用 implements实现,其他的必须实现空方法,而空方法是没有意义的。

因此我们使用一个类来实现方法,后续的只需要继承即可适配器实现需要的方法即可。

错误用法:

public class ProductVideoOrder implements PayGateway{

    @Override
    public void unifiedorder() {
        System.out.println("下单");
    }

    @Override
    public void refund() {
        System.out.println("退款");
    }

    @Override
    public void query() {
        
    }

    @Override
    public void sendRedPack() {

    }
}

创建适配器

public class PayGatewayAdapter implements PayGateway{
    @Override
    public void unifiedorder() {

    }

    @Override
    public void refund() {

    }

    @Override
    public void query() {

    }

    @Override
    public void sendRedPack() {

    }
}

正确用法

public class ProductVideoOrder extends PayGatewayAdapter{

    @Override
    public void unifiedorder() {
        System.out.println("下单");
    }

    @Override
    public void refund() {
        System.out.println("退款");
    }
}

类的适配器模式

需求:有一个旧的类,功能稳定运行,如何在不修改旧的类的情况下新增功能?

场景:

有个电商支付项目,里面有个登录功能,已经线上运行了
客户端A 调用生产环境的登录接口B,且线上稳定运行了好几年。

某天,公司接到收购了别的公司的项目,需要把这套系统部署在起来,且收购的项目也有对应的客户端C,但是两个客户端和服务端的协议不一样

需求:收购的项目客户端C,需要做公司原来的项目用户数据打通,连接公司的服务端登录接口B,你能想到几个解决方案?

1、修改旧项目B的登录接口,兼容C客户端协议(可能影响线上接口,不稳定)
2、新增全新的登录接口F,采用C客户端协议(和旧的业务逻辑会重复)
3、新增一个转换协议接口,客户端C调用旧的B接口之前,使用转换接口转换下协议(适配器模式,推荐这个方式)

旧的类

public class OldModule {

    public void moduleA(){
        System.out.println("OldModule moduleA");
    }

}

接口——当做通信的桥梁

public interface TargetModule {

    /**
     * 和需要整合的类方法名一样
     */
    void moduleA();

    /**
     * 新的方法
     */
    void moduleB();

}

适配器

/**
 * 继承旧的类,实现接口,由于继承旧的类,旧的类中的方法就无需实现
 * @author cv大魔王
 * @version 1.0
 * @date 2021/7/12 19:22
 */
public class Adapter extends OldModule implements TargetModule{
    @Override
    public void moduleB() {
        System.out.println("Adapter ModuleB");
    }
}

使用:

public static void main(String[] args) {
    TargetModule targetModule = new Adapter();
    targetModule.moduleA();
    targetModule.moduleB();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CV大魔王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值