一,前言:
职责链模式的注意事项和细节:
优点:
- 将请求与处理分开,实现了解耦,提高系统的灵活性。
- 简化了对象,使对象无需知道链的结构。
缺点:
- 当链比较长的时候,性能会受到影响。
- 采用了类似递归的方式,调试逻辑比较复杂。
二,职责链模式:
2.1,UML图:
2.2、代码实例:
Step 1) 创建 Approver 抽象类:
public abstract class Approver {
Approver approver;
String name;
public Approver(String name){
this.name = name;
}
public void setApprover(Approver approver){
this.approver = approver;
}
public abstract void processRequset(PurchaseRequest purchaseRequest);
}
Step 2) 创建 DepartmentApprover 实现类:
public class DepartmentApprover extends Approver{
public DepartmentApprover(String name) {
super(name);
}
@Override
public void processRequset(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() <= 5000){
System.out.println("请求编号 id = " + purchaseRequest.getId() + " 被 " + this.name + "处理 !");
}else {
approver.processRequset(purchaseRequest);
}
}
}
Step 3) 创建 CollegeApprovor 实现类:
public class CollegeApprovor extends Approver{
public CollegeApprovor(String name) {
super(name);
}
@Override
public void processRequset(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 10000){
System.out.println("请求编号 id = " + purchaseRequest.getId() + " 被 " + this.name + "处理 !");
}else {
approver.processRequset(purchaseRequest);
}
}
}
Step 4) 创建 SchoolMasterApprovor 实现类:
public class SchoolMasterApprovor extends Approver{
public SchoolMasterApprovor(String name) {
super(name);
}
@Override
public void processRequset(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() > 30000){
System.out.println("请求编号 id = " + purchaseRequest.getId() + " 被 " + this.name + "处理 !");
}else {
approver.processRequset(purchaseRequest);
}
}
}
Step 5) 创建 ViceSchoolMasterApprovor 实现类:
public class ViceSchoolMasterApprovor extends Approver{
public ViceSchoolMasterApprovor(String name) {
super(name);
}
@Override
public void processRequset(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000){
System.out.println("请求编号 id = " + purchaseRequest.getId() + " 被 " + this.name + "处理 !");
}else {
approver.processRequset(purchaseRequest);
}
}
}
Step 6) 创建 PurchaseRequest 类:
public class PurchaseRequest {
private int type;
private float price = 0.0f;
private int id = 0;
public PurchaseRequest(int type, float price, int id) {
this.type = type;
this.price = price;
this.id = id;
}
public int getType() {
return type;
}
public float getPrice() {
return price;
}
public int getId() {
return id;
}
}
Step 7) 创建 main 方法:
public class Client {
public static void main(String[] args) {
PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
CollegeApprovor collegeApprovor = new CollegeApprovor("李院长");
ViceSchoolMasterApprovor viceSchoolMasterApprovor = new ViceSchoolMasterApprovor("王副校");
SchoolMasterApprovor schoolMasterApprovor = new SchoolMasterApprovor("杜校长");
departmentApprover.setApprover(collegeApprovor);
collegeApprovor.setApprover(viceSchoolMasterApprovor);
viceSchoolMasterApprovor.setApprover(schoolMasterApprovor);
schoolMasterApprovor.setApprover(departmentApprover);
departmentApprover.processRequset(purchaseRequest);
}
}
•由 ChiKong_Tam 写于 2020 年 10 月 23 日