责任链模式 - 969251639/study GitHub Wiki

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

项目场景:有些商品有自己的销售规则,而这个规则可能是多个规则的组合而成,而多个规则的组合就是通过责任链方式串联起来,配置在数据库中

  1. 定义“链”的基本元素——节点(Node),包含了具体的规则和下一个节点等基本信息
    class Node {
	private Rule rule;
        ...
	private Node nextNode;
        ...
    }
    class Rule {
        private Node node;
        ...
    }
  1. 定义一个抽象的规则验证
public abstract class AbstractRule {
    public abstract Node valid(...);
    public void valids(Rule rule) {
        ...
        valid(Rule);
        ...
        Node node = rule.getNode().getNextNode();
        if(node != null) {
            node.getRule().valid(...);
        }
    }
}
  1. 规则类继承抽象规则
public class Rule1 extends AbstractRule {
    @Override
    public Node valid(...) {
        ...
        
    }
}

public class Rule2 extends AbstractRule {
    @Override
    public Node valid(...) {
        ...
        
    }
}
  1. 使用
//组合这些节点形成链
Node node1 = new Node(...)
Node node2 = new Node(...)
Node node3 = new Node(...)

node1.setNextNode(node2);
node2.setNextNode(node3);

node1.valids(node1.getRule());
node2.valids(node1.getRule());
node3.valids(node1.getRule());
...