设计模式之责任链模式

来源:互联网 发布:qq一手数据出售群 编辑:程序博客网 时间:2024/06/01 23:19
任链(职责连)模式(Chain Of Responsibility)


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


场景:
多个对象处理同一个请求,
具体由哪一个对象来处理,在程序运行过程中动态决定


角色:
Handler 抽象处理者角色
ConcreteHandler 具体的处理者角色


OCP 对修改关闭,对扩展开放


功能链
不确定被哪些处理对象处理,可能是多个,也有可能一个也没有


战场受伤的战士


优点:
请求者和接收者,松散耦合
动态组合职责




缺点:
影响性能


本质:分散职责,动态组合





示例:

/** * 抽象的处理者(领导)  * @date 2016年2月23日  */public abstract class Leader {//上一级领导处理者(下一个处理对象)protected Leader nextHandler;/** * 处理报账请求 * @param money */public void handleRequest(int money){//报账金额,在处理对象能处理的金额范围内if(money <= limit()){//处理handle(money);}else{//超过了报账金额,交给上一级领导if(nextHandler != null){nextHandler.handleRequest(money);}}}/** * 不同领导处理的金额权限不一样 * @return */protected abstract int limit();/** * 不同领导处理报账的具体方式不一样 * @param money */protected abstract void handle(int money);}

/** * 具体的处理者(组长)  * @date 2016年2月23日  */public class GroupLeader extends Leader{@Overrideprotected int limit() {return 1000;}@Overrideprotected void handle(int money) {System.out.println("组长批复报销"+money+"元");}}
/** * 具体的处理者(主管)  * @date 2016年2月23日  */public class DirectorLeader extends Leader{@Overrideprotected int limit() {return 5000;}@Overrideprotected void handle(int money) {System.out.println("主管批复报销"+money+"元");}}
/** * 具体的处理者(经理)  * @date 2016年2月23日  */public class Manager extends Leader{@Overrideprotected int limit() {return 10000;}@Overrideprotected void handle(int money) {System.out.println("经理批复报销"+money+"元");}}

/** * 具体的处理者(老板)  * @date 2016年2月23日  */public class Boss extends Leader{@Overrideprotected int limit() {return Integer.MAX_VALUE;}@Overrideprotected void handle(int money) {System.out.println("老板批复报销"+money+"元");}}

调用:

public class Client {public static void main(String[] args) {//处理对象GroupLeader h1 = new GroupLeader();DirectorLeader h2 = new DirectorLeader();Manager h3 = new Manager();Boss h4 = new Boss();//组合//h1.nextHandler = h2;h2.nextHandler = h3;h3.nextHandler = h4;//请求h2.handleRequest(100000);}}

运行结果:

老板批复报销100000元


整理自教程


0 0