设计模式-责任链模式

来源:互联网 发布:网易房产数据 北京 编辑:程序博客网 时间:2024/06/07 14:50

定义:

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。

优点:

1.将请求者和发送者解耦
2.可以通过改变链中的成员或成员的顺序来动态的新增或则删除责任
3.简化对象的处理过程
4.责任链模式与 if…else 相比,耦合性要低一些,因为它将条件判定分散到各个处理类中,并且这些处理类的优先处理顺序可以随意的设定,并且如果想要添加新的 handler 类也是十分简单的,这符合开放闭合原则。

缺点:

1.不能保证请求一定被接收
2.可能会造成循环调用

角色:

抽象处理者(Handler)角色:这个角色通常由一个Java抽象类或者Java接口实现。定义出一个方法以设定和返回对下个处理者的引用。以及一个抽象方法来规范子类处理请求的操作。
具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下个处理者,因此,如果需要当前处理者具持有下一个处理者的引用

分类:

纯的责任链模式:一个具体处理者角色处理只能对请求作出两种行为中的一个:一个是自己处理(承担责任),另一个是把责任推给下个处理者。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。请求在责任链中必须被处理,不能出现无果而终的结局。
不纯的责任链模式:一个请求可以最终不被任何接收端对象所接收。

使用场景:

1.Servlet中的过滤器的链式处理
2.java中的catch链

需求:

请假制度为:
请假0.5天,需主管批准
请假超过0.5天小于等于3天,需项目经理批准
请假超过3天小于等于7天,需人事部门批准

代码实现:

多个处理这之间传递的实体类:Client.java

package com.tianlh.service.design_pattern.Chain_of_Responsibility;import lombok.Data;/** * Created by wb-tianlihui on 2017/11/15. */@Datapublic class Client {    /**     * 请假天数     */    private int leaveDays;    public Client(int leaveDays) {        this.leaveDays = leaveDays;    }}

抽象处理者:Handler.java

package com.tianlh.service.design_pattern.Chain_of_Responsibility;/** * Created by wb-tianlihui on 2017/11/15. */public abstract class Handler {    /**     * 持有后继的责任对象     */    private Handler handler;    /**     * 定义所有处理者的操作规范     */    abstract void operator(Client client);    /**     * 获取后继的责任对象     */    public Handler getHandler() {        return handler;    }    /**     * 设置后继的责任对象     */    public void setHandler(Handler handler) {        this.handler = handler;    }}

具体处理者:DeptManageHanler.java, ManageHandler.java, PersonnelHanler.java

package com.tianlh.service.design_pattern.Chain_of_Responsibility;/** * Created by wb-tianlihui on 2017/11/15. */public class DeptManageHanler extends Handler {    @Override    void operator(Client client) {        if(0.5 < client.getLeaveDays() && client.getLeaveDays() <= 3){            System.out.println("部门经理处理该逻辑");        }else{            if(null != getHandler()){                getHandler().operator(client);            }        }    }}package com.tianlh.service.design_pattern.Chain_of_Responsibility;public class ManageHandler extends Handler {    @Override    void operator(Client client) {        if(client.getLeaveDays() <= 0.5){            System.out.println("主管处理该逻辑");        }else{            if(null != getHandler()){                getHandler().operator(client);            }        }    }}package com.tianlh.service.design_pattern.Chain_of_Responsibility;/** * Created by wb-tianlihui on 2017/11/15. */public class PersonnelHanler extends Handler{    @Override    void operator(Client client) {        if(3 < client.getLeaveDays() && client.getLeaveDays() <= 7){            System.out.println("人事部门处理该逻辑");        }else{            if(null != getHandler()){                getHandler().operator(client);            }        }    }}

测试类:Main.java

package com.tianlh.service.design_pattern.Chain_of_Responsibility;/** * Created by wb-tianlihui on 2017/11/15. */public class Main {    public static void main(String[] args) {        //初始化        Client client = new Client(6);        ManageHandler h1 = new ManageHandler();        DeptManageHanler h2 = new DeptManageHanler();        PersonnelHanler h3 = new PersonnelHanler();        //定义责任链处理规则        h1.setHandler(h2);        h2.setHandler(h3);        //执行操作        h1.operator(client);    }}
原创粉丝点击