美文网首页
责任链模式

责任链模式

作者: 虎三呀 | 来源:发表于2018-09-25 15:04 被阅读0次

模式小故事

相信大家出差的都有过报销的经历吧!
小明负责一个异地的项目,去出差花费五万元,回来报销需要审批。
组长审批最大:500 元
主管审批最大:1000元
经理审批最大:5000元
老板审批最大:xxxx元
由于花费太高,所以要一层一层的向上报请求,就像链条一样,环环相扣,有首有尾,所以这就是责任链模式基本场景。

模式小案例UML:

模式小案例实现:

//领导
public abstract class Leader {
    Leader nextHandler;// 上级领导
    // 处理报账

    public final void handlerReq(int money) {
        if (money <= limit()) {
            handler(money);
        } else if (nextHandler != null) {
            nextHandler.handlerReq(money);
        } else {
            System.out.println("无法报销");
        }
    }

    abstract void handler(int money) ;

    abstract int limit();
}

//组长
public class GroupLeader extends Leader {

    @Override
    int limit() {
        return 500;
    }

    @Override
     void handler(int money) {
        System.out.println("组长报销了: " + money + " 元");
    }

}
//主管
public class Director extends Leader {

    @Override
    int limit() {
        return 1000;
    }

    @Override
    void handler(int money) {
        System.out.println("主管报销了: " + money + " 元");       
    }

}
//经理
public class Manager extends Leader {

    @Override
    int limit() {
        return 5000;
    }

    @Override
    void handler(int money) {
        System.out.println("经理报销了: " + money + " 元");       
    }

}
//老板
public class Boss extends Leader {

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

    @Override
    void handler(int money) {
        System.out.println("老板报销了: " + money + " 元");       
    }

}
//小明报销:
public class Client {
    public static void main(String[] args) {
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        
        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;
        
        groupLeader.handlerReq(Integer.MAX_VALUE);
    }
}

模式最精简案例UML

模式最精简案例

public abstract class Handler {
    Handler successor;// 下一个节点处理者

    public abstract void handler(String req);
}
public class ConcreteAHandler extends Handler {

    @Override
    public void handler(String req) {
        if (req.equals("req1")) {
            System.out.println("命令:req1  执行完成");
            return;
        } else {
            this.successor.handler(req);
        }
    }

}
public class ConcreteBHandler extends Handler {

    @Override
    public void handler(String req) {
        if (req.equals("req2")) {
            System.out.println("命令:req2  执行完成");
            return;
        } else {
            if (this.successor == null) {
                System.out.println("无法处理请求!");
                return;
            }
            this.successor.handler(req);
        }
    }

}
public class Client {
    public static void main(String[] args) {
        // 构造节点
        ConcreteAHandler aReq = new ConcreteAHandler();
        ConcreteBHandler bReq = new ConcreteBHandler();

        // 设置节点
        aReq.successor = bReq;

        // 处理请求;
        aReq.handler("req1");

    }
}

模式优缺点

优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。

相关文章

网友评论

      本文标题:责任链模式

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