责任链模式
对于一个请求,可能有多个处理者,将处理着连接成一个链
如部门里面有一个张三,张三要报销1500元交通费,根据公司规定,1500元属于部门经理审批,所有这个请求应该由部门经理处理
实现思路
采用链表方式模拟链
具体代码
申请人信息
// 申请人信息
public class Request {
private String name;
private float price;
private String desc;
public Request(String name, float price, String desc) {
super();
this.name = name;
this.price = price;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "申请人 [name=" + name + ", price=" + price + ", desc=" + desc + "]";
}
}
审批信息
// 审批信息
public class Result {
private String appName;
private String appResult;
private String appDesc;
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAppResult() {
return appResult;
}
public void setAppResult(String appResult) {
this.appResult = appResult;
}
public String getAppDesc() {
return appDesc;
}
public void setAppDesc(String appDesc) {
this.appDesc = appDesc;
}
@Override
public String toString() {
return "审批结果 [appName=" + appName + ", appResult=" + appResult + ", appDesc=" + appDesc + "]";
}
}
处理链
public abstract class DealChain {
protected DealChain nextChain;
public void setNextChain(DealChain nextChain) {
this.nextChain = nextChain;
}
public abstract Result execute(Request request);
}
// 小经理
public class LittleManager extends DealChain {
@Override
public Result execute(Request request) {
float price = request.getPrice();
if (price <= 1000) {
Result result = new Result();
result.setAppName("王华");
// 随机审批一下
if (new Random().nextBoolean()) {
result.setAppResult("同意");
} else {
result.setAppResult("不同意");
result.setAppDesc("与事实结果不符。");
}
return result;
}
// 继续往下高级领导
return nextChain.execute(request);
}
}
// 经理
public class Manager extends DealChain {
@Override
public Result execute(Request request) {
float price = request.getPrice();
if (price <= 5000) {
Result result = new Result();
result.setAppName("方世玉");
// 随机审批一下
if (new Random().nextBoolean()) {
result.setAppResult("同意");
} else {
result.setAppResult("不同意");
result.setAppDesc("金额出入");
}
return result;
}
// 继续往下高级领导
return nextChain.execute(request);
}
}
// 区域经理
public class RegionManager extends DealChain {
@Override
public Result execute(Request request) {
float price = request.getPrice();
if (price <= 10000) {
Result result = new Result();
result.setAppName("大嘴猴");
// 随机审批一下
if (new Random().nextBoolean()) {
result.setAppResult("同意");
} else {
result.setAppResult("不同意");
result.setAppDesc("理由不充分");
}
return result;
}
// 继续往下高级领导
return nextChain.execute(request);
}
}
// 总经理
public class RootManager extends DealChain {
@Override
public Result execute(Request request) {
float price = request.getPrice();
Result result = new Result();
result.setAppName("马云");
if (price <= 100000) {
result.setAppResult("同意");
} else {
result.setAppResult("不同意");
result.setAppDesc("金额超过100000");
}
return result;
}
}
测试类
public class ChainTest {
public static void main(String[] args) {
// 申请人
Request request = new Request("张三", 1500, "室内交通费!");
Request request1 = new Request("李四", 5700, "玩耍费!");
Request request2 = new Request("王五", 15100, "摔倒!");
Request request3 = new Request("宝强", 150000, "讹钱");
// 审批
doAction(request);
doAction(request1);
doAction(request2);
doAction(request3);
}
// 处理链
private static void doAction(Request request) {
DealChain dealChain = ChainBulder.chainBulder();
Result result = dealChain.execute(request);
print(request, result);
}
// 格式化输出
private static void print(Request request, Result result) {
System.out.println("=============================================");
System.out.println(request);
System.out.println(result);
}
}
ChainBulder
public class ChainBulder {
public static DealChain chainBulder() {
DealChain head = new LittleManager();
DealChain head1 = new Manager();
DealChain head2 = new RegionManager();
DealChain head3 = new RootManager();
head.setNextChain(head1);
head1.setNextChain(head2);
head2.setNextChain(head3);
return head;
}
}
测试结果
=============================================
申请人 [name=张三, price=1500.0, desc=室内交通费!]
审批结果 [appName=方世玉, appResult=同意, appDesc=null]
=============================================
申请人 [name=李四, price=5700.0, desc=玩耍费!]
审批结果 [appName=大嘴猴, appResult=不同意, appDesc=理由不充分]
=============================================
申请人 [name=王五, price=15100.0, desc=摔倒!]
审批结果 [appName=马云, appResult=同意, appDesc=null]
=============================================
申请人 [name=宝强, price=150000.0, desc=讹钱]
审批结果 [appName=马云, appResult=不同意, appDesc=金额超过100000]