这段代码是适配器模式的例子吗?
Is this code an example of the Adapter pattern?
页面信息class
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int pageNum;
private int pageSize;
private int size;
private int startRow;
private int endRow;
private long total;
private int pages;
private List<T> list;
}
回应class
public class ResponseDto<T> implements Serializable {
private String msg = "success";
private int code = SUCCESS;
private T data;
}
PageResponseDto class
public class PageResponseDto<T> extends ResponseDto<List<T>> {
private int pageNum;
private int pageSize;
private int size;
private long total;
private int pages;
public PageResponseDto() {
super();
}
public PageResponseDto(PageInfo<T> p) {
super(p.getList());
this.pageNum = p.getPageNum();
this.pageSize = p.getPageSize();
this.size = p.getSize();
this.total = p.getTotal();
this.pages = p.getPages();
}
}
使用
public PageResponseDto<OrderDto> findStoreOrderByPage(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<OrderDto> storeOrderList = basicDataMapper.findStoreOrderByPage();
PageInfo<OrderDto> p = new PageInfo<>(storeOrderList);
return new PageResponseDto<>(p);
}
因为系统有统一的returnclass'ResponseDto',我想把classPageInfo改成ResponseDto.So写这个code.I 有一个问题
这段代码可以称为适配器模式吗?如果不是,这段代码是否使用了设计模式?或者这个转换应该叫什么?
当前设计
就目前而言,此代码并未实现适配器模式。就众所周知的设计模式而言,这段代码不满足我所知道的任何设计模式。相反,下面的设计使用了基本的软件原则:继承和伪委托。
您的目标是 "transform the PageInfo to ResponseDto." 我假设您的意思是要传递一个 ResponseDto 实例,该实例封装并委托给 PageInfo class。
之所以这不是适配器模式的示例,是因为目前没有 ResponseDto 独有的接口。事实上,它根本没有接口,也没有对 PageInfo 的委托 – 问题 1。
Adapter 模式专门用来封装不同的接口。
注意/建议/问题:
- PageResponseDTO 目前违反了 Demeter 法则;它对 PageInfo 的内部结构了解得太多了。
- PageInfo 通过揭示其整个内部结构来打破封装。
- 与其 PageResponseDTO 从 PageInfo 复制所有内容,不如保留对 PageInfo 实例的引用,并在必要时委托给它?
- 您始终可以复制委托的接口而不是显示它,但是,如果您发现自己复制了太多它的功能接口,请考虑公开它。在重构中,Martin Fowler 将此分别称为封装委托和消除中间人。
页面信息class
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int pageNum;
private int pageSize;
private int size;
private int startRow;
private int endRow;
private long total;
private int pages;
private List<T> list;
}
回应class
public class ResponseDto<T> implements Serializable {
private String msg = "success";
private int code = SUCCESS;
private T data;
}
PageResponseDto class
public class PageResponseDto<T> extends ResponseDto<List<T>> {
private int pageNum;
private int pageSize;
private int size;
private long total;
private int pages;
public PageResponseDto() {
super();
}
public PageResponseDto(PageInfo<T> p) {
super(p.getList());
this.pageNum = p.getPageNum();
this.pageSize = p.getPageSize();
this.size = p.getSize();
this.total = p.getTotal();
this.pages = p.getPages();
}
}
使用
public PageResponseDto<OrderDto> findStoreOrderByPage(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<OrderDto> storeOrderList = basicDataMapper.findStoreOrderByPage();
PageInfo<OrderDto> p = new PageInfo<>(storeOrderList);
return new PageResponseDto<>(p);
}
因为系统有统一的returnclass'ResponseDto',我想把classPageInfo改成ResponseDto.So写这个code.I 有一个问题 这段代码可以称为适配器模式吗?如果不是,这段代码是否使用了设计模式?或者这个转换应该叫什么?
当前设计
就目前而言,此代码并未实现适配器模式。就众所周知的设计模式而言,这段代码不满足我所知道的任何设计模式。相反,下面的设计使用了基本的软件原则:继承和伪委托。
您的目标是 "transform the PageInfo to ResponseDto." 我假设您的意思是要传递一个 ResponseDto 实例,该实例封装并委托给 PageInfo class。
之所以这不是适配器模式的示例,是因为目前没有 ResponseDto 独有的接口。事实上,它根本没有接口,也没有对 PageInfo 的委托 – 问题 1。
Adapter 模式专门用来封装不同的接口。
注意/建议/问题:
- PageResponseDTO 目前违反了 Demeter 法则;它对 PageInfo 的内部结构了解得太多了。
- PageInfo 通过揭示其整个内部结构来打破封装。
- 与其 PageResponseDTO 从 PageInfo 复制所有内容,不如保留对 PageInfo 实例的引用,并在必要时委托给它?
- 您始终可以复制委托的接口而不是显示它,但是,如果您发现自己复制了太多它的功能接口,请考虑公开它。在重构中,Martin Fowler 将此分别称为封装委托和消除中间人。