java23中设计模式——行为模式——Chain of Responsibility(职责链)

原创
2016/03/31 11:12
阅读数 30

角色

抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {  

      

    /** 

     * 持有后继的责任对象 

     */  

    protected Handler successor;  

    /** 

     * 示意处理请求的方法,虽然这个示意方法是没有传入参数的 

     * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 

     */  

    public abstract void handleRequest();  

    /** 

     * 取值方法 

     */  

    public Handler getSuccessor() {  

        return successor;  

    }  

    /** 

     * 赋值方法,设置后继的责任对象 

     */  

    public void setSuccessor(Handler successor) {  

        this.successor = successor;  

    }  

      

}  

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ConcreteHandler extends Handler {  

    /** 

     * 处理方法,调用此方法处理请求 

     */  

    @Override  

    public void handleRequest() {  

        /** 

         * 判断是否有后继的责任对象 

         * 如果有,就转发请求给后继的责任对象 

         * 如果没有,则处理请求 

         */  

        if(getSuccessor() != null)  

        {              

            System.out.println("放过请求");  

            getSuccessor().handleRequest();              

        }else  

        {              

            System.out.println("处理请求");  

        }  

    }  

  

}  

客户端类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Client {  

  

    public static void main(String[] args) {  

        //组装责任链  

        Handler handler1 = new ConcreteHandler();  

        Handler handler2 = new ConcreteHandler();  

        handler1.setSuccessor(handler2);  

        //提交请求  

        handler1.handleRequest();  

    }  

  

}  

可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。

由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有将查询结果封装成对象下家,就自行处理。

因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。由于第二个处理者对象没有下家,于是自行处理请求。活动时序图如下所示。





应用

申请聚餐费用的管理,申请聚餐费用的大致流程一般是,由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。

不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500将查询结果封装成对象元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。



当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。申请人只要直接与项目经理交互就可以,其余的工作在黑盒中,究竟流程是怎样的,最后是由谁审批通过的,申请人无需关心。








抽象处理者角色类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {  

    /** 

     * 持有下一个处理请求的对象 将查询结果封装成对象

     */  

    protected Handler successor = null;  

    /** 

     * 取值方法 

     */  

    public Handler getSuccessor() {  

        return successor;  

    }  

    /** 

     * 设置下一个处理请求的对象 

     */  

    public void setSuccessor(Handler successor) {  

        this.successor = successor;  

    }  

    /** 

     * 处理聚餐费用的申请 

     * @param user    申请人 

     * @param fee    申请的钱数 

     * @return        成功或失败的具体通知 

     */  

    public abstract String handleFeeRequest(String user , double fee);  

}  

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ProjectManager extends Handler {  

  

    @Override  

    public String handleFeeRequest(String user, double fee) {  

          

        String str = "";  

        //项目经理权限比较小,只能在500以内  

        if(fee < 500)  

        {  

            //为了测试,简单点,只同意张三的请求  

            if("张三".equals(user))  

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。


角色

抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {  

      

    /** 

     * 持有后继的责任对象 

     */  

    protected Handler successor;  将查询结果封装成对象

    /** 

     * 示意处理请求的方法,虽然这个示意方法是没有传入参数的 

     * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 

     */  

    public abstract void handleRequest();  

    /** 

     * 取值方法 

     */  

    public Handler getSuccessor() {  

        return successor;  

    }  

    /** 

     * 赋值方法,设置后继的责任对象 

     */  

    public void setSuccessor(Handler successor) {  

        this.successor = successor;  

    }  

      

}  

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ConcreteHandler extends Handler {  

    /** 

     * 处理方法,调用此方法处理请求 

     */  

    @Override  

    public void handleRequest() {  

        /** 

         * 判断是否有后继的责任对象 

         * 如果有,就转发请求给后继的责任对象 

         * 如果没有,则处理请求 

         */  

        if(getSuccessor() != null)  

        {              

            System.out.println("放过请求");  

            getSuccessor().handleRequest();              

        }else  

        {              

            System.out.println("处理请求");  

        }  

    }  

  

}  

客户端类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Client {  

  

    public static void main(String[] args) {  

        //组装责任链  

        Handler handler1 = new ConcreteHandler();  

        Handler handler2 = new ConcreteHandler();  

        handler1.setSuccessor(handler2);  

        //提交请求  

        handler1.handleRequest();  

    }  

  

}  

可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。

由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有下家,就自行处理。

因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。由于第二个处理者对象没有下家,于是自行处理请求。活动时序图如下所示。





应用

申请聚餐费用的管理,申请聚餐费用的大致流程一般是,由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。

不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。



当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。申请人只要直接与项目经理交互就可以,其余的工作在黑盒中,究竟流程是怎样的,最后是由谁审批通过的,申请人无需关心。





展开阅读全文
加载中

作者的其它热门文章

打赏
1
0 收藏
分享
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部