责任链模式(行为型)

 

设计模式的3个分类:创建型模式、结构型模式、行为型模式

责任链模式(Chain of Responsibility Pattern)定义:

责任链模式包含一些命令对象和一系列的处理对象(多个处理对象被连接成一条链),每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。

 

责任链模式图示:

 

代码实现:

/**
 * 请求类
 */
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;
    }
}
 
/**
 * 抽象的"处理类"
 */
public abstract class Approver {
    
    String name;
    Approver approver;//下一个处理者
 
    public Approver(String name) {
        this.name = name;
    }
 
    //设置下一个处理者
    public void setApprover(Approver approver) {
        this.approver = approver;
    }
 
    //处理审批请求的方法,得到一个请求,处理由子类完成的,
    public abstract void processRequest(PurchaseRequest request);
 
}
 
/**
 * 具体处理类1
 */
public class DepartmentApprover extends Approver{
 
    public DepartmentApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest request) {
        if(request.getPrice() <= 5000) {
            System.out.println(" 请求编号 id = " + request.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(request);
        }
    }
}
 
/**
 * 具体处理类2
 */
public class CollegeApprover extends Approver{
 
    public CollegeApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest request) {
        if(request.getPrice() > 5000 && request.getPrice() <= 10000) {
            System.out.println(" 请求编号 id = " + request.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(request);
        }
    }
}
 
/**
 * 具体处理类3
 */
public class ViceSchoolMasterApprover extends Approver {
 
    public ViceSchoolMasterApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() > 10000 && request.getPrice() <= 30000) {
            System.out.println(" 请求编号 id = " + request.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(request);
        }
    }
}
 
/**
 * 具体处理类4
 */
public class SchoolMasterApprover extends Approver{
 
    public SchoolMasterApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest request) {
        if(request.getPrice() > 30000) {
            System.out.println(" 请求编号 id = " + request.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(request);
        }
    }
}
 
/**
 * Test
 */
public class ResponsibilityChainPatternDemo {
 
    public static void main(String[] args) {
 
        //创建一个请求
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 1000, 1);
 
        //创建处理对象
        DepartmentApprover departmentApprover = new DepartmentApprover("Department : Mr Zhang");
        CollegeApprover collegeApprover = new CollegeApprover("College : Mr Li");
        ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("ViceSchoolMaster : Mr Wang");
        SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("SchoolMaster : Mr Zhao");
 
        //将各个处理对象串成一个"链"
        departmentApprover.setApprover(collegeApprover);
        collegeApprover.setApprover(viceSchoolMasterApprover);
        viceSchoolMasterApprover.setApprover(schoolMasterApprover);
        schoolMasterApprover.setApprover(departmentApprover);
 
        //通过"责任链"中的任意对象开始处理请求,最终会找到能处理请求的对象
        viceSchoolMasterApprover.processRequest(purchaseRequest);
 
    }
}  

 

参考:

youtube: 责任链模式(韩顺平)

 

posted @ 2021-01-13 16:05  黑冰台  阅读(135)  评论(0)    收藏  举报