适配器模式 - 969251639/study GitHub Wiki

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能

意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

项目场景:有两个项目,分页的结构定义不一样,那么A系统需要调用B系统的分页数据,那么需要一个适配器来适配B系统的分页结构能转换成A系统分页结构

  1. 定义A、B系统的分页结构
//A系统分页   
public class PageFinder<T> implements PageBase<T>, Serializable {

	/**
	 * 每页的记录数
	 */
	private int pageSize = PageContants.DEFAULT_PAGE_SIZE;

	/**
	 * 当前页中存放的数据
	 */
	@Expose
	@SerializedName("rows")
	private List<T> data;

	/**
	 * 总记录数
	 */
	@Expose
	@SerializedName("total")
	private int rowCount;

	/**
	 * 页数
	 */
	
	@Expose
	@SerializedName("page")
	private int pageCount;

	/**
	 * 跳转页数
	 */
	private int pageNo;

	/**
	 * 是否有上一页
	 */
	private boolean hasPrevious = false;

	/**
	 * 是否有下一页
	 */
	private boolean hasNext = false;
        ...
}

//B系统分页   
public class PageBean<T> {
    // 当前页
    private Integer currentPage = 1;
    // 每页显示的总条数
    private Integer pageSize = 10;
    // 总条数
    private Integer totalNum;
    // 是否有下一页
    private Integer isMore;
    // 总页数
    private Integer totalPage;
    // 开始索引
    private Integer startIndex;
    // 分页结果
    private List<T> items;
    ...
}
  1. A系统实现了PageBase接口,PageBase定义了需要适配的目标方法
public interface PageBase<T> {
	public int getPageSize();
	public List<T> getData();
	public int getRowCount();
	public int getPageCount();
	public int getPageNo();
	public boolean isHasPrevious();
	public boolean isHasNext();
	public int getStartOfPage();
}
  1. 实现适配器
public class PageAdapter<T> implements PageBase<T> {
	private PageBean<T> pageBean;
	public PageAdapter(PageBean<T> pageBean) {
		this.pageBean = pageBean;
	}

	@Override
	public int getPageSize() {
		return pageBean.getPageSize();
	}

	@Override
	public List<T> getData() {
		return pageBean.getItems();
	}

	@Override
	public int getRowCount() {
		return pageBean.getTotalNum();
	}

	@Override
	public int getPageCount() {
		return pageBean.getTotalPage();
	}

	@Override
	public int getPageNo() {
		return pageBean.getCurrentPage();
	}

	@Override
	public boolean isHasPrevious() {
		return pageBean.getCurrentPage() == 1;
	}

	@Override
	public boolean isHasNext() {
		return pageBean.getCurrentPage() == pageBean.getTotalPage();
	}

	@Override
	public int getStartOfPage() {
		return (pageBean.getCurrentPage() - 1) * pageBean.getPageSize();
	}
        ...
}
  1. 使用
//A系统调用B系统的分页方法 
public class BService {
    ...
    PageBean<T> pageBean = BService.pageXXX(...);
    //将PageBean适配成A系统所使用的PageBase
    PageBase pageBase = new PageAdapter<T>(pageBean);
    ...
}