设计模式系列-适配器模式(Adapter)

本文介绍适配器模式,一种使不兼容接口协同工作的设计模式。通过实例展示如何使用适配器模式解决新旧分页接口不兼容的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器模式(Adapter)

简介

别名包装器(Wrapper),本文主要介绍对象适配器模式。
使不兼容的两个接口通过适配的方式一起工作,一般是一个老接口通过适配器来适配新接口,因为老接口已经被大量引用,更改老接口会带来较大的工作量和bug隐患。

类层次和调用关系图

类层次和调用关系

示例

项目中数据展示一般会有分页需求,开始阶段我们定义一个接口:OldPagination来表示分页信息,详情如下:

public interface OldPagination {

    //start from 0
    long pageIndex();

    int pageSize();

    long total();
}

实现类:OldPaginationImpl

public class OldPaginationImpl implements OldPagination {

    private long pageIndex;
    private long total;
    private int pageSize;

    public OldPaginationImpl(long pageIndex, long total, int pageSize) {
        this.pageIndex = pageIndex;
        this.total = total;
        this.pageSize = pageSize;
    }

    @Override
    public long pageIndex() {
        return pageIndex;
    }

    @Override
    public int pageSize() {
        return pageSize;
    }

    @Override
    public long total() {
        return total;
    }
}

由于OldPagination 是基础接口,在代码中大量引用,后来在开源世界里发现有个优秀的分页组件,计划引入到项目中,但是组件里表示分页的信息的接口定义如下:

public interface NewPagination {

    long offset();

    long total();

    int pageSize();
}

虽然从业务上讲新老接口做的是同一件事,但是接口定义不兼容,老接口被大量引用不能修改,这时需要引入适配器让新老接口协同工作,适配器定义如下:

public class NewPaginationAdapterImpl implements NewPagination {

    private OldPagination oldPagination;

    public NewPaginationAdapterImpl(OldPagination oldPagination) {
        this.oldPagination = oldPagination;
    }

    @Override
    public long offset() {
        return oldPagination.pageIndex() * oldPagination.pageSize();
    }

    @Override
    public long total() {
        return oldPagination.total();
    }

    @Override
    public int pageSize() {
        return oldPagination.pageSize();
    }
}

消费新接口的工具类如下:

public class ConsumeNewPagination {

    public static void consume(NewPagination newPagination) {
        System.out.format("offset:%d,total:%d,pageSize:%d",
                newPagination.offset(), newPagination.total(), newPagination.pageSize());
    }
}

Main 测试如下:

public class Main {

    public static void main(String[] args) {
        OldPagination old = new OldPaginationImpl(1,20,10);
        NewPagination adapter = new NewPaginationAdapterImpl(old);
        ConsumeNewPagination.consume(adapter);
    }
}

输出:

offset:10,total:20,pageSize:10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值