Java职责链模式的简单理解

设计模式之-职责链模式

定义:在责任链中由处理者动态的处理任务,客户端并不知道是哪一个对象处理的。

包含

  1. 有多个类作为处理对象,并形成一个环装(生产线)
  2. 请求类(一批任务下来)
  3. 处理类(工头分配任务)

实例:学校报销
<5000元可以交给主任报销
5000<X<10000 可以交给院长处理
10000< X< 30000 可以交给副校长处理
>30000 交给校长处理

需求请求类

/**
 * 请求类
 */
public class PurchaseRequest {
    private int type=0;//请求类型
    private int number=0;
    private float price=0.0f;//花费的金额
    private int id = 0;//编号

    /**
     * 构造器
     * @param type
     * @param id
     * @param price
     */
    public PurchaseRequest(int type, int id, float price) {
        this.type = type;
        this.id=id;
        this.price = price;
    }

    public int getType() {
        return type;
    }

    public int getNumber() {
        return number;
    }

    public float getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }
}

处理人Handler
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 processRequest(PurchaseRequest purchaseRequest);
}

处理者

主任(小于5000处理):

public class DepartmentApprover extends Approver {

    public DepartmentApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice()<=5000){
            System.out.println("请求编号id= "+ purchaseRequest.getId() +"被"+this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

院长(5000,10000)

public class CollegeApprover  extends Approver{
    public CollegeApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice()>5000 && 10000>=purchaseRequest.getPrice()){
            System.out.println("请求编号id= "+ purchaseRequest.getId() +"被"+this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

副校长(10000,30000)

public class ViceSchoolMasterApprover extends Approver {
    public ViceSchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() >10000 && 30000>purchaseRequest.getPrice()){
            System.out.println("请求编号id= "+ purchaseRequest.getId() +"被"+this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

校长(大于30000处理)

public class SchoolMasterApprover  extends Approver{
    public SchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice()>=30000){
            System.out.println("请求编号id= "+ purchaseRequest.getId() +"被"+this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

Client调用(Main函数)
public class Client {
    public static void main(String[] args) {
        //创建一个请求
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 2,5000);

        //创建相关的审批人
        DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
        CollegeApprover collegeApprover = new CollegeApprover("李院长");
        ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校长");
        SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("奎校长");


        //需要将各个审批的下一个人处理好(处理人形成环状:)
        departmentApprover.setApprover(collegeApprover);
        collegeApprover.setApprover(viceSchoolMasterApprover);
        viceSchoolMasterApprover.setApprover(schoolMasterApprover);
        schoolMasterApprover.setApprover(departmentApprover);

        
        departmentApprover.processRequest(purchaseRequest);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值