概述
责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止
示例
首先定义一个抽象类用来做接口调用对象
package com.kun.chainofresponsibility.chainms; /** * @author kun * @data 2019/4/1 20:10 */ public abstract class AbstractApprover { AbstractApprover successor; String name; AbstractApprover(String name){ this.name = name; } /** * 处理请求 * @param request 请求 */ public abstract void processRequest(PurchaseRequest request); public void setSuccessor(AbstractApprover successor){ this.successor = successor; } }
其中successor则是下个要执行的handler
package com.kun.chainofresponsibility.chainms;
/**
* @author kun
* @data 2019/4/1 20:13
*/
public class DepartmentApprover extends AbstractApprover {
public DepartmentApprover(String name){
super(name + " DepartmentLeader");
}
@Override
public void processRequest(PurchaseRequest request) {
if ((5000<= request.getSum()) && (request.getSum() < 10000)){
System.out.println("**This request " + request.getID() + " will be handled by " + this.name + " **");
}else {
successor.processRequest(request);
}
}
}
package com.kun.chainofresponsibility.chainms;
/**
* @author kun
* @data 2019/4/1 20:13
*/
public class PresidentApprover extends AbstractApprover {
public PresidentApprover(String name){
super(name + " President");
}
@Override
public void processRequest(PurchaseRequest request) {
if (50000 <= request.getSum()){
System.out.println("**This request " + request.getID() + " will be handled by " + this.name + " **");
}else {
successor.processRequest(request);
}
}
}
其余的同上
接下来用法展示
package com.kun.chainofresponsibility;
import com.kun.chainofresponsibility.chainms.*;
/**
* @author kun
* @data 2019/4/1 20:30
*/
public class MainTest {
public static void main(String[] args) {
Client client = new Client();
AbstractApprover groupLeader = new GroupApprover("Tom");
AbstractApprover departmentLeader = new DepartmentApprover("Jerry");
AbstractApprover vicePresident = new VicePresidentApprover("Kate");
AbstractApprover president = new PresidentApprover("Bush");
groupLeader.setSuccessor(departmentLeader);
departmentLeader.setSuccessor(vicePresident);
vicePresident.setSuccessor(president);
president.setSuccessor(groupLeader);
groupLeader.processRequest(client.sendRequest(1, 100, 40));
groupLeader.processRequest(client.sendRequest(2, 200, 40));
groupLeader.processRequest(client.sendRequest(3, 300, 40));
groupLeader.processRequest(client.sendRequest(4, 400, 140));
}
}由上可见通过给当前运行的handler中传入下个执行的handler从而可以达到链式执行的效果。