美文网首页设计模式
责任链模式(Chain Of Responsibility)

责任链模式(Chain Of Responsibility)

作者: 秀儿2020 | 来源:发表于2020-07-21 14:38 被阅读0次

    定义

    使多个对象都有机会处理请求,从而避免请求的发送者和请求的接收者之间的耦合关系,将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    本质

    分离职责,动态组合。

    登场角色

    • Handler(处理者)

      定义了处理请求的接口,处理者角色知道下一个处理者是谁,如果自己无法处理该请求,他会将请求传递给下一个处理者。

    • ConcreteHandler(具体的处理者)

      处理请求的具体角色。

    • Client(请求者)

      向第一个处理者发送请求的角色。

    示例代码

    /**
     * 抽象的处理者
     */
    public abstract class Leader {
        protected Leader nextLeader;
    
        /**
         * 自身能报销的额度权限
         * @return
         */
        public abstract int limit();
    
        /**
         * 处理报销行为
         * @param money
         */
        public abstract void handler(int money);
    
        /**
         * 处理报账请求
         * @param money
         */
        public final void handlerRequest(int money){
            if(money < limit()){ //如果自己能够处理,就处理
                handler(money);
            }else{
                //如果处理不了,传递给下一个处理者
                if(null != nextLeader){
                    nextLeader.handlerRequest(money);
                }
            }
        }
    }
    
    /**
     * 处理者
     */
    public class GroupLeader extends Leader{
        @Override
        public int limit() {
            return 1000;
        }
        @Override
        public void handler(int money) {
            System.out.println("组长批复报销" + money + "元");
        }
    }
    
    /**
     *
     */
    public class Director extends Leader{
        @Override
        public int limit() {
            return 5000;
        }
    
        @Override
        public void handler(int money) {
            System.out.println("主管批复报销" + money + "元");
        }
    }
    
    
    
    public class Manager extends Leader{
        @Override
        public int limit() {
            return 10000;
        }
    
        @Override
        public void handler(int money) {
            System.out.println("经理批复报销" + money + "元");
        }
    }
    
    
    public class Boss extends Leader{
        @Override
        public int limit() {
            return Integer.MAX_VALUE;
        }
    
        @Override
        public void handler(int money) {
            System.out.println("老板批复报销" + money + "元");
        }
    }
    
    
    public class Main {
        public static void main(String[] args){
            GroupLeader groupLeader = new GroupLeader();
            Director director = new Director();
            Manager manager = new Manager();
            Boss boss = new Boss();
    
            //设置上一级领导者对象
            groupLeader.nextLeader = director;
            director.nextLeader = manager;
            manager.nextLeader = boss;
            //发起报账请求
            groupLeader.handlerRequest(50000);
        }
    }
    

    运行结果

    老板批复报销50000元
    

    功能

    责任链模式主要用来处理”客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求“这样的情况。也就是需要让请求者和接收者解耦,这样就可以动态的切换和组合接收者了。

    优点

    • 请求者和接收者松散耦合。
    • 动态组合职责。把功能护理分散到单独的职责对象总,然后在使用的时候,可以动态的组合职责形成职责链,从而可以灵活的给对象分噢诶职责,也可以灵活的实现或者改变对象的职责。

    缺点

    • 产生很多细粒度的对象。
    • 不一定能被处理。

    何时使用

    • 多个对象可以处理同一个请求,但那个对象处理则在运行时动态处理。
    • 在请求处理者不明确的情况下,向多个对象中的一个提交一个请求。
    • 需要动态指定一组对象处理请求。

    相关文章

      网友评论

        本文标题:责任链模式(Chain Of Responsibility)

        本文链接:https://www.haomeiwen.com/subject/wtpikktx.html