设计模式之职责链模式
一、需求
1.1、需求
1.2、传统方案
1.3、传统方案问题解析
二、解决方案
2.1、基本介绍
2.2、原理类图
2.3、职责链解决方案
2.3代码实现
2.3.1、PurchaseRequest
package com.chenheng.design.chain;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 10:23
* @description:
**/
@Data
@AllArgsConstructor
public class PurchaseRequest {
private Integer id;
private float price;
private Integer type;
}
2.3.2、Approver
package com.chenheng.design.chain;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 10:20
* @description:
**/
public abstract class Approver {
/**
* 下一个处理者
*/
Approver nextApprover;
String name;
public Approver(String name) {
this.name = name;
}
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
public abstract void processRequest(PurchaseRequest request);
}
2.3.3、DepartmentApprover
package com.chenheng.design.chain;
import cn.hutool.core.util.StrUtil;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 10:26
* @description:
**/
public class DepartmentApprover extends Approver{
public DepartmentApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
float price = request.getPrice();
if (price <= 5000) {
String template = "请求编号id={},price={},被 {} 处理了";
String info = StrUtil.format(template, request.getId(), request.getPrice(), this.name);
System.out.println(info);
}else {
nextApprover.processRequest(request);
}
}
}
2.3.4、CollegeApprover
package com.chenheng.design.chain;
import cn.hutool.core.util.StrUtil;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 14:54
* @description:
**/
public class CollegeApprover extends Approver{
public CollegeApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
float price = request.getPrice();
if (price > 5000 && price <= 10000) {
String template = "请求编号id={},price={},被 {} 处理了";
String info = StrUtil.format(template, request.getId(), request.getPrice(), this.name);
System.out.println(info);
}else {
nextApprover.processRequest(request);
}
}
}
2.3.5、ViceSchoolMasterApprover
package com.chenheng.design.chain;
import cn.hutool.core.util.StrUtil;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 14:56
* @description:
**/
public class ViceSchoolMasterApprover extends Approver{
public ViceSchoolMasterApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
float price = request.getPrice();
if (price > 10000 && price <= 30000) {
String template = "请求编号id={},price={},被 {} 处理了";
String info = StrUtil.format(template, request.getId(), request.getPrice(), this.name);
System.out.println(info);
}else {
nextApprover.processRequest(request);
}
}
}
2.3.5、SchoolMasterApprover
package com.chenheng.design.chain;
import cn.hutool.core.util.StrUtil;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 14:57
* @description:
**/
public class SchoolMasterApprover extends Approver{
public SchoolMasterApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest request) {
float price = request.getPrice();
if (price > 30000) {
String template = "请求编号id={},price={},被 {} 处理了";
String info = StrUtil.format(template, request.getId(), request.getPrice(), this.name);
System.out.println(info);
}else {
nextApprover.processRequest(request);
}
}
}
2.3.5、Client
package com.chenheng.design.chain;
/**
* @author: chenheng@ovopark.com
* @create: 2021-12-20 15:05
* @description:
**/
public class Client {
public static void main(String[] args) {
PurchaseRequest request = new PurchaseRequest(1, 20000, 1);
//创建相关的审批人
DepartmentApprover departmentApprover = new DepartmentApprover("刘主任");
CollegeApprover collegeApprover = new CollegeApprover("李院长");
ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("彭副校长");
SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("陈校长");
//需要将各个审批级别的下一个设置好 (处理人构成环形: )
departmentApprover.setNextApprover(collegeApprover);
collegeApprover.setNextApprover(viceSchoolMasterApprover);
viceSchoolMasterApprover.setNextApprover(schoolMasterApprover);
schoolMasterApprover.setNextApprover(departmentApprover);
// departmentApprover.processRequest(request);
schoolMasterApprover.processRequest(request);
}
}