首页 > 代码库 > 设计模式—责任链模式

设计模式—责任链模式

责任链模式在请求对象不清楚处理对象是谁的情况下使用该模式。

   请求对象把请求提交给处理对象,所有的处理对象依次进行判断,如果是自己的处理范围则进行处理,结束请求向后传递,如果不属于自己的处理范围则向下传递请求直到请求被处理。

  注意区分责任链模式和装饰模式的区别:责任链是对请求对象的处理过滤;装饰模式是对被装饰对象的自由功能扩展。

实例说明:员工请假,5天以内组长有权批准,5~10天ceo有权批准,10~20天董事长有权批准。

定义管理者接口:Manager

  public abstract void dealRequest(int request);为处理请假的方法

package com.zpj.designMode.chainOfResponsibility;public abstract class Manager {    protected Manager leader;    // 处理方法    public abstract void dealRequest(int request);    public Manager(Manager leader) {        super();        this.leader = leader;    }}

添加三个管理者:

package com.zpj.designMode.chainOfResponsibility;public class Chairman extends Manager {    public Chairman(Manager leader) {        super(leader);    }    @Override    public void dealRequest(int request) {        //有权对>20天的请假进行处理        if (request <= 20) {            System.out.println("Chairman--------允许----------");        } else {            System.out.println("Chairman--------拒绝----------");        }    }}package com.zpj.designMode.chainOfResponsibility;public class ChiefExecutiveOfficer extends Manager {    public ChiefExecutiveOfficer(Manager leader) {        super(leader);    }    @Override    public void dealRequest(int request) {        //有权对>10天的请假进行处理        if (request <= 10) {            System.out.println("ChiefExecutiveOfficer--------允许----------");        } else {            leader.dealRequest(request);        }    }}package com.zpj.designMode.chainOfResponsibility;public class GroupLeader extends Manager {    public GroupLeader(Manager leader) {        super(leader);    }    @Override    public void dealRequest(int request) {        //有权对>5天的请假进行处理        if (request <= 5) {            System.out.println("GroupLeader--------允许----------");        } else {            leader.dealRequest(request);        }    }}

使用示例:

package com.zpj.designMode.chainOfResponsibility;import org.junit.Test;public class testUnit {    @Test    public void test01() {        Manager chairman = new Chairman(null);        Manager ceo = new ChiefExecutiveOfficer(chairman);        Manager groupLeader = new GroupLeader(ceo);        //向组长发起请假申请        groupLeader.dealRequest(26);    }}

处理者一层一层的对请求进行过滤,直至被处理或者过滤结束

---------------------------

 

设计模式—责任链模式