21、设计模式(行为型)之责任链模式

作用

  • 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

何时使用

  • 在处理消息的时候以过滤很多道。

优点

  1. 降低耦合度。它将请求的发送者和接收者解耦。
  2. 简化了对象。使得对象不需要知道链的结构。
  3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  4. 增加新的请求处理类很方便。

实例

/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 16:46
 * @Version:
 * @Acton:  封裝请假的信息
 */
public class LeaveRquest {

    private String empName;
    private int leaveDays;
    private String reason;

    public LeaveRquest(String empName, int leaveDays, String reason) {
        this.empName = empName;
        this.leaveDays = leaveDays;
        this.reason = reason;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

    public void setLeaveDays(int leaveDays) {
        this.leaveDays = leaveDays;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 16:48
 * @Version:
 * @Acton:  审批抽象类
 */
public abstract class Leader {

    protected String name;          //子类需要用到
    protected Leader nextLeader;    //责任链上面的下一个对象
    public Leader(String name) {
        this.name = name;
    }
    //设置责任链下衣蛾对象
    public void setNextLeader(Leader nextLeader) {
        this.nextLeader = nextLeader;
    }

    /* 处理请求的核心的业务方法 */
    public abstract void handlerRequest(LeaveRquest leaveRquest);
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 17:13
 * @Version:
 * @Acton:  经理
 */
public class Manager  extends Leader{
    public Manager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(LeaveRquest leaveRquest) {
        if (leaveRquest.getLeaveDays() < 10){                //如果是主任审批范围,就主任处理
            System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
            System.out.println("经理:"+this.name+"审批通过");
        } else {                                            //否则另外处理
            if(this.nextLeader != null){                    //查看后面还有没有人处理
                this.nextLeader.handlerRequest(leaveRquest);    //有人处理
            }
        }
    }
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 17:13
 * @Version:
 * @Acton:  副经理
 */
public class ViceManager extends Leader{
    public ViceManager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(LeaveRquest leaveRquest) {
        if (leaveRquest.getLeaveDays() < 20){                //如果是主任审批范围,就主任处理
            System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
            System.out.println("副经理:"+this.name+"审批通过");
        } else {                                            //否则另外处理
            if(this.nextLeader != null){                    //查看后面还有没有人处理
                this.nextLeader.handlerRequest(leaveRquest);    //有人处理
            }
        }
    }
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 17:13
 * @Version:
 * @Acton:  总经理
 */
public class GeneraManager extends Leader{
    public GeneraManager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(LeaveRquest leaveRquest) {
        if (leaveRquest.getLeaveDays() < 30){                //如果是主任审批范围,就主任处理
            System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
            System.out.println("总经理:"+this.name+"审批通过");
        } else {                                            //否则另外处理
            System.out.println(" 你是不是不想干了 ?" + leaveRquest.getEmpName());
        }
    }
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 17:06
 * @Version:
 * @Acton:  主任审批
 */
public class Diractor extends Leader{

    public Diractor(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(LeaveRquest leaveRquest) {
        if (leaveRquest.getLeaveDays() < 3){                //如果是主任审批范围,就主任处理
            System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
            System.out.println("主任:"+this.name+"审批通过");
        } else {                                            //否则另外处理
            if(this.nextLeader != null){                    //查看后面还有没有人处理
                this.nextLeader.handlerRequest(leaveRquest);    //有人处理
            }
        }
    }
}
/**
 * @Author: create_By: chenxin
 * @Data:Created in 2018/9/5 17:22
 * @Version:
 * @Acton:
 */
public class TestResponOfChainDemo {
    public static void main(String[] args){
        test1();
    }
    public static void test1(){
        //创建审批者
        Leader zl = new Diractor("张良");
        Leader hf = new Manager("韩非");
        Leader sh = new GeneraManager("始皇");
        Leader gn =  new ViceManager("盖聂");
        //设置责任链
        zl.setNextLeader(hf);
        hf.setNextLeader(gn);
        gn.setNextLeader(sh);

        //开始请假操作
        LeaveRquest rquest = new LeaveRquest("李斯", 30, "去找赵高");
        zl.handlerRequest(rquest);
    }
}

 

关系结构图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值