设计模式---责任链(Iterator pattern)

2017-09-29  本文已影响0人  RalapHao

介绍

多个对象都可以处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到对象处理完成。

应用场景

多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定

UML

UML.png

举例说明

员工有2万要报销,首先找组长报销,但是是组长最大处理额度为1000,所以组长找主管报销,主管只能报5000以内,主管找经理,但是经理也只能在1万以内,最后经理找老板,老板处理了,这就是一个责任链的应用场景。

代码实现

领导抽象类

public abstract class Leader {

    /**
     * 上一级处理者
     */
    protected Leader nextHandler;

    public final void handleRequest(int money) {

        if(money>limit()){
            nextHandler.handleRequest(money);
        }else{
            handle(money);
        }
    }


    /**
     * 自身能处理的最大额度
     */
    public abstract int limit();

    /**
     * 处理行为
     */
    public abstract void handle(int money);

}

组长

public class GroupLeader extends Leader {

    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println("组长审批金额" + money + "元");
    }
}

主管

public class Director extends Leader {

    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println("主管审批金额" + money + "元");
    }
}

经理

public class Manager extends Leader {

    @Override
    public int limit() {
        return 10000;
    }

    @Override
    public void handle(int money) {
        System.out.println("经理审批金额" + money + "元");
    }
}

老板

public class Boss extends Leader {

    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.println("老板审批金额" + money + "元");
    }
}

测试

 public static void main(String[] args) {
        GroupLeader group = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        group.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        group.handleRequest(7000);
        group.handleRequest(2000);
        group.handleRequest(200);
        group.handleRequest(50000);
    }

输出

输出截图.png

总结

责任链就是讲所有能处理请求的对象连成一个链,然后逐个寻找能处理请求的那个对象,就这么简单,
优点:可以对请求和处理者关系解耦,提高代码的灵活性,
缺点:需要遍历链,影响性能。

上一篇下一篇

猜你喜欢

热点阅读