设计模式—行为型—责任链模式

理解

一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。注意:”请求”,”链”,”处理者”。

术语

图片摘自hehonghui的github

分析这个类图:

  • Handler—抽象处理者
    1.拥有一个void handlerRequest()方法。
    2.并且自身包含自己的一个对象(自聚合)。

  • ConcreteHandler—具体处理者
    1.拥有一个handleRequest方法。
    2.Handler类依赖于ConcreteHandler类,因Handler是一个抽象的。
    3.且ConcreteHandler继承于Handler。

案例和思路

还是用出差这个例子来说,小白出差找领导申请差旅费,不同的领导能审批不同的额度(官越大审批钱越多)。

1.角色为员工小白和4个领导,由于领导较多(责任分离)所以可抽象为一个Leader类出来,然后具体实现3个不同级别的Leader(小组长,财务总监,大Boss),由于本场景就一个员工,所以员工类我就不抽象了。
操作:先创建了4个类:(Leader,BossLeader,MoneyLeader,TeamLeader),Leader就是抽象处理者Handler,而其余3个类则是具体处理者ConcreteHandler。然后再创建一个员工类Emploee。类创建好了,接下来我们分析逻辑如何写。

2.Leader有一个方法handleMoney(money),这不用多想,领导就干这事的。然后就是”领导”之间的上级下级”关系”,这也是责任链中的”链”的体现,即一个请求具备在链条上具备多个被处理的节点或是可能性,那么我们再定义一个方法setNextLeader(Leader),意为在本次请求不在当前领导的责任范围内时,”下家处理者”是谁,一般就是”领导的领导”。

代码

这里我就贴下Leader和测试(Client)类,其他代码我已提到github了。
github地址

Leader.java

package com.zj.dp.责任链模式;

public abstract class Leader {

    private String name;//领导名字
    private Leader nextLeader;//链的体现,下家领导
    private int handelArea;//审批额度区间

    public Leader(int handelArea, String name) {
        this.handelArea = handelArea;
        this.name = name;
    }

    void handleMoney(int money) {
        if (money > handelArea) {
            if (null != nextLeader) {
                nextLeader.handleMoney(money);
                return;
            } else {
                if (getName() != null && getName().equals("boss")) {
                    System.out.println("已经超过大Boss的审批额度");
                } else {
                    System.out.println(getName() + "的下家领导为空");
                }
            }
        } else {
            System.out.println("小子,你申请的钱" + money + "由我" + name + "批下来了");
        }
    }

    void setNextLeader(Leader nextLeader) {
        this.nextLeader = nextLeader;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ClientTest.java

package com.zj.dp.责任链模式;

public class ClientTest {

    public static void main(String[] args) {

        //员工初始化
        Employee xiaoMing = new Employee("小明");

        //领导初始化
        BossLeader bossLeader = new BossLeader(50000, "boss");
        MoneyLeader moneyLeader = new MoneyLeader(10000, "moneyLeader");
        GroupLeader groupLeader = new GroupLeader(1000, "groupLeader");
        groupLeader.setNextLeader(moneyLeader);
        moneyLeader.setNextLeader(bossLeader);

        //发起员工请求
        xiaoMing.requestMoney(15000, groupLeader);
        xiaoMing.requestMoney(1500, moneyLeader);
        xiaoMing.requestMoney(150, groupLeader);
    }
}

输出结果

小明_向_groupLeader_提出了申请_15000
小子,你申请的钱15000由我boss批下来了
小明_向_moneyLeader_提出了申请_1500
小子,你申请的钱1500由我moneyLeader批下来了
小明_向_groupLeader_提出了申请_150
小子,你申请的钱150由我groupLeader批下来了

Thanks

hehonghui-github
shindo-Uml

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/81187559