栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021年10月9日-设计模式之责任链模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021年10月9日-设计模式之责任链模式

第二十四章:责任链模式 一、情景引入

作为学生会某部门干事,现在需要递交经费申请请求。经费如果数额不大的话就由部长审批,如果数额较大需找主席审批,如果数额很大需找辅导员审批。

我们可以选择 if 语句来解决这个问题,首先我们自己根据数额判断一下应该找谁审批,然后把这个请求给他。

不过,问题来了,如果申请人我不知道数额标准怎么办。比如你不能要求每个去政府机构办事的公民都熟读办事标准吧!所以能不能将请求和处理请求之间解耦呢(+_+)?

现在我们使用责任链模式重新解决这个问题。申请人我直接吧请求给部长或者主席或者辅导员,至于谁来处理我不关心,因为这是他们的事。

二、模式简介

  • Handler 抽象处理者,声明了处理请求的方法。里面聚合了另一个处理者,众多处理者就形成了处理链
三、审批案例

抽象处理者类:

public abstract class Approver {
    protected Approver approver;

    public void setApprover(Approver approver) {
        this.approver = approver;
    }

    abstract public void processRequest(PurchaseRequest request);
}

具体的处理者:

public class Chairman extends Approver{
    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() >= 200 && request.getPrice() < 300) {
            System.out.println("主席处理请求:" + request);
        } else {
            super.approver.processRequest(request);
        }
    }
}
public class Counsellor extends Approver {
    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() >= 0 && request.getPrice() < 100) {
            System.out.println("辅导员处理请求:" + request);
        } else {
            super.approver.processRequest(request);
        }
    }
}
public class Minister extends Approver {
    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() >= 100 && request.getPrice() < 200) {
            System.out.println("部长处理请求:" + request);
        } else {
            super.approver.processRequest(request);
        }
    }
}
public class ViceMinister extends Approver{
    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() >= 0 && request.getPrice() < 100) {
            System.out.println("副部长处理请求:" + request);
        } else {
            super.approver.processRequest(request);
        }
    }
}

请求类

public class PurchaseRequest {
    private int id;
    private float price;

    public PurchaseRequest(int id, float price) {
        this.id = id;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public float getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "PurchaseRequest{" +
                "id=" + id +
                ", price=" + price +
                '}';
    }
}

测试类

public class DutyChainTest {
    public static void main(String[] args) {
        ViceMinister viceMinister = new ViceMinister();
        Minister minister = new Minister();
        Chairman chairman = new Chairman();
        Counsellor counsellor = new Counsellor();
        // 形成一个环
        viceMinister.setApprover(minister);
        minister.setApprover(chairman);
        chairman.setApprover(counsellor);
        counsellor.setApprover(viceMinister);

        PurchaseRequest request = new PurchaseRequest(1, 250);
        viceMinister.processRequest(request);
    }
}



四、模式总结

优点:

  • 请求和处理分开,实现解耦

缺点:

  • 当链比较长时,性能会受到影响,所以新增节点时需要判断链的节点是否过多
  • 调试不方便

应用场景:

  • 有多个对象可以处理一个请求时
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号