设计模式之责任链模式

责任链模式

行为型模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决: 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递,所以责任链将请求的发送者和请求的处理者解耦了。

何时使用: 在处理消息的时候以过滤很多道。

如何解决: 拦截的类都实现统一接口。

关键代码: Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

具体实现

责任链模式

学校OA系统采购审批项目:需求是:

  1. 采购教学器材
  2. 如果金额小于等于5000,由教学主任审批
  3. 如果金额大于5000小于10000,则由院长审批
  4. 如果金额大于10000小于30000,则由副校长审批
  5. 如果金额大于30000,则由校长审批

第一步:创建采购请求

public class PurchaseRequest {

    private int type = 0;//请求类型
    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 {

    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);

}

第三步:继承抽象职责类

public class DepartmentApprover extends Approver {

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

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() <= 5000) {
            System.out.println("请求编号为:" + purchaseRequest.getId() + "被" + this.name + "处理");
        } else {
            System.out.println(this.name + "处理不了...");
            approver.processRequest(purchaseRequest);
        }
    }
}
public class CollegeApprover extends Approver {

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

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 1000) {
            System.out.println("请求编号为:" + purchaseRequest.getId() + "被" + this.name + "处理");
        } else {
            System.out.println(this.name + "处理不了...");
            approver.processRequest(purchaseRequest);
        }
    }
}
public class ViceSchoolMasterApprover extends Approver {


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

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000) {
            System.out.println("请求编号为:" + purchaseRequest.getId() + "被" + this.name + "处理");
        } else {
            System.out.println(this.name + "处理不了...");
            approver.processRequest(purchaseRequest);
        }
    }
}
public class SchoolMasterApprover extends Approver {


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

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

第四步:创建测试类

public class Client {

    public static void main(String[] args){
        //创建一个请求
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 1000, 1);
        //创建相关审批人
        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);

        viceSchoolMasterApprover.processRequest(purchaseRequest);
    }

}

运行如下:

王副校长处理不了...
赵校长处理不了...
请求编号为:1被张主任处理

优点:

    1、降低耦合度。它将请求的发送者和接收者解耦。

    2、简化了对象。使得对象不需要知道链的结构。

    3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

    4、增加新的请求处理类很方便。

缺点:

    1、不能保证请求一定被接收。

    2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。     3、可能不容易观察运行时的特征,有碍于除错。

你可能感兴趣的:(java,设计模式)