简介
别名包装器(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