Java设计模式-结构性设计模式(适配器设计模式)

简介

1、⻅名知意,是作为两个不兼容的接⼝之间的桥梁,属于结构型模式
2、适配器模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作

常⻅的⼏类适配器

类的适配器模式

想将⼀个类转换成满⾜另⼀个新接⼝的类时,可以使⽤类的适配器模式,创建⼀个新类,继承原有的类,实现新的接⼝即可

对象的适配器模式

想将⼀个对象转换成满⾜另⼀个新接⼝的对象时,可以创建⼀个适配器类,持有原类的⼀个实例,在适配器类的⽅法中,调⽤实例的⽅法就⾏

接⼝的适配器模式

不想实现⼀个接⼝中所有的⽅法时,可以创建⼀个Adapter,实现所有⽅法,在写别的类的时候,继承Adapter类即

应⽤场景

1、电脑需要读取内存卡的数据,读卡器就是适配器
2、⽇常使⽤的转换头,如电源转换头,电压转换头
3、系统需要使⽤现有的类,⽽这些类的接⼝不符合系统的需要
4、JDK中InputStreamReader就是适配器
5、JDBC就是我们⽤的最多的适配器模式

JDBC给出⼀个客户端通⽤的抽象接⼝,每⼀个具体数据库⼚商 如 SQL ServerOracleMySQL等,就会开发JDBC驱动,就是⼀个介于JDBC接⼝和数据库引擎接⼝之间的适配器软件

在这里插入图片描述

提⾼开发效率 接⼝适配器在⽇常开发⾥⾯的应⽤

接⼝适配器

有些接⼝中有多个抽象⽅法,当我们写该接⼝的实现类时,必须实现该接⼝的所有⽅法,这明显有时⽐较浪费,因为并不是所有的⽅法都是我们需要的,有时只需要实现部分接⼝就可以了

demo
我并不想实现所有接口,只想重写部分接口

原始接口

public interface PayGateway {

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

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

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

    /**
     * 发红包
     */
    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("ProductVideoOrder unifiedorder");
    }

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

使用部分接口 增加新方法

public class ProductVipOrder extends PayGatewayAdapter {

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

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

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

⽣产环境接⼝-需要兼容新的业务怎么办

需求背景

有个电商⽀付项⽬,⾥⾯有个登录功能,已经线上运⾏了
客户端A 调⽤⽣产环境的登录接⼝B,且线上稳定运⾏了好⼏年。某天,公司接到收购了别的公司的项⽬,需要把这套系统部署在起来,且收购的项⽬也有对应的客户端C,但是两个客户端和服务端的协议不⼀样
需求:收购的项⽬客户端C,需要做公司原来的项⽬⽤户数据打通,连接公司的服务端登录接⼝B,你能想到⼏个解决⽅案?
1、修改就项⽬B的登录接⼝,兼容C客户端协议(可能影响线上接⼝,不稳定)
2、新增全新的登录接⼝F,采⽤C客户端协议(和旧的业务逻辑会重复)
3、新增⼀个转换协议接⼝,客户端C调⽤旧的B接⼝之前,使⽤转换接⼝转换下协议(适配器模式,推荐这个⽅式)

在这里插入图片描述
总结

1、在使⽤⼀些旧系统或者是类库时,经常会出现接⼝不兼容的问题,适配器模式在解决这类问题具有优势
2、学习设计模式⼀定不要局限代码层⾯,要从软件系统整体去考虑,⽽不是为了使⽤设计模式,⽽去使⽤设计模式

优点

1、可以让任何两个没有关联的类⼀起运⾏,使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作
2、增加灵活度, 提⾼复⽤性,适配器类可以在多个系统使⽤,符合开闭原则

缺点

整体类的调⽤链路增加,本来A可以直接调⽤C,使⽤适配器后 是A调⽤BB再调⽤C

适配器设计模式-类的适配器

简介

想将⼀个类转换成满⾜另⼀个新接⼝的类时,可以使⽤类的适配器模式,创建⼀个新类,继承原有的类,实现新的接⼝即可

在这里插入图片描述
demo

老的原始类

public class OldModule {

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

新的目标接口

public interface TargetModule {

    /**
     * 和需要适配的类方法名一样
     */
    void methodA();

    /**
     * 新的方法,如果有多个新的方法直接编写就行
     */
    void methodB();

    void methodC();

}

适配器

public class Adapter extends OldModule implements TargetModule {

    /**
     * 新的方法,和老的类方法不一样
     */
    @Override
    public void methodB() {
        System.out.println("Adapter methodB");
    }

    /**
     * 新的方法,和老的类方法不一样
     */
    @Override
    public void methodC() {
        System.out.println("Adapter methodC");
    }
}

测试

public class Main {

    public static void main(String[] args) {
        TargetModule targetModule = new Adapter();
        targetModule.methodA();
        targetModule.methodB();
        targetModule.methodC();
    }
}

结果

0ldModule methodA
Adapter methodB
Adapter methodC
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值