责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
使用场景
比如替换特殊字符串
比如封控校验
比如订单状态校验
比如spring的过滤器
doFilter( ServletRequest request, ServletResponse response, FilterChain chain )
比如订单类型是自营,普通商品,88元以上的商品,包邮。可以用责任链判断是否包邮
创建订单表:
public class Order {
/**
* 订单类型 1自营,2其它
*/
Integer orderType;
/**
* 产品类型 1普通商品,2其它
*/
Integer productType;
/**
* 价格
*/
BigDecimal price;
public Integer getOrderType() {
return orderType;
}
public void setOrderType(Integer orderType) {
this.orderType = orderType;
}
public Integer getProductType() {
return productType;
}
public void setProductType(Integer productType) {
this.productType = productType;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
创建Filter接口:
public interface Filter {
public boolean doFilter(Order order);
}
创建过滤器:
public class OrderTypeFilter implements Filter {
@Override
public boolean doFilter(Order order) {
if(order.orderType==1){
return true;
}
return false;
}
}
public class PriceFilter implements Filter {
@Override
public boolean doFilter(Order order) {
if(order.price.compareTo(new BigDecimal(88))>=0){
return true;
}
return false;
}
}
public class ProudctTypeFilter implements Filter {
@Override
public boolean doFilter(Order order) {
if(order.productType==1){
return true;
}
return false;
}
}
创建责任链:
public class FilterChain implements Filter{
List<Filter> filterList=new ArrayList<>();
public FilterChain add(Filter f){
filterList.add(f);
return this;
}
@Override
public boolean doFilter(Order order) {
for(Filter f:filterList){
if(!f.doFilter(order)){
return false;
}
}
return true;
}
}
main方法测试:
public class Main {
public static void main(String[] args) {
FilterChain filterChain = new FilterChain();
filterChain.add(new OrderTypeFilter()).add(new ProudctTypeFilter()).add(new PriceFilter());
Order order=new Order();
order.setOrderType(1);
order.setProductType(1);
order.setPrice(BigDecimal.ONE);
System.out.println(filterChain.doFilter(order));
}
}