Java设计模式的学习-责任链模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85256373

Java的23中设计模式分类三大类:

  1. 行为型模式 -- 关注系统中对象之间的相互交互 , 研究系统在运行时对象与对象之间的相互通信和协作,进一步明确对象的职责
  2. 创造型模式 -- 关注对象的创建过程
  3. 结构型模式 -- 关注对象和类的组织

责任链模式定义:

  • 将能够处理同一类的对象连成一条链,所提交的请求沿着链传递 , 链上的对象逐个判断是否有能力处理该请求 , 如果能处理则处理 , 如果不能则传递给链上的下一个对象 。

场景如下:

 公司里面 ,请假条的审批流程 :

  •    如果请假天数小于3天,主任审批
  •    如果请假天数大于3天,小于10天 ,经理审批
  •    如果请假天数等于10天 ,小于30天,总经理审批
  •    如果等于30天,提示拒绝

uml类图如下

接下来代码来进行实现

1),创建请假条的类 Leave

/**请假条类
 * @author 晓电脑
 */
public class Leave {

    private String name;
    private int leaveDays;
    private String describe;


    public Leave(String name, int leaveDays, String describe) {
        this.name = name;
        this.leaveDays = leaveDays;
        this.describe = describe;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

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

    public String getDescribe() {
        return describe;
    }

    public void setDescribe(String describe) {
        this.describe = describe;
    }
}

2),创建抽象处理者的类 Leader

/** 抽象类
 * @author 晓电脑
 */
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(Leave leave);
}

3),创建经理类 Diector类 继承于抽象类

/**主任类
 * @author 晓电脑
 */
public class Director extends Leader {

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

    @Override
    public void HandlerRequest(Leave leave) {
        if (leave.getLeaveDays()<3){
            System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
            System.out.println("主任" + this.name + "进行了批准");
        }else{
            if (this.nextLeader != null){
                this.nextLeader.HandlerRequest(leave);
            }
        }
    }
}

4),创建经理类 也同样继承与抽象类

/**经理类
 * @author 晓电脑
 */
public class Manager extends Leader {

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

    @Override
    public void HandlerRequest(Leave leave) {
        if (leave.getLeaveDays()<10){
            System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
            System.out.println("经理" + this.name + "进行了批准");
        }else{
            if (this.nextLeader != null){
                this.nextLeader.HandlerRequest(leave);
            }
        }
    }
}

5),创建总经理类 也继承与抽象类

/**总经理类
 * @author 晓电脑
 */
public class GeneralManager extends Leader {

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

    @Override
    public void HandlerRequest(Leave leave) {
        if (leave.getLeaveDays()<30){
            System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
            System.out.println("总经理" + this.name + "进行了批准");
        }else{
            System.out.println("这位员工居然请假" + leave.getLeaveDays() + "莫非想辞职");
        }
    }
}

6),创建测试客户端

/**
 * @author 晓电脑
 */
public class Client {
    public static void main(String[] args) {
        //初始化经理
        Leader a = new Director("张三");
        Leader b = new Manager("李四");
        Leader c = new GeneralManager("王五");
        //追加责任链
        a.setNextLeader(b);
        b.setNextLeader(c);
        //请假流程
        Leave leave = new Leave("赵六",8,"回老家探亲");
        a.HandlerRequest(leave);

    }
}

运行结果如下

开发中常见的场景:

  • Java中 ,异常机制就是一种责任链模式。 一个try可以对应多个catch ,当第一个catch不匹配类型 ,则自动跳到第二个catch。
  • Servlet 开发中.过滤器的链式处理
  • Struts2 中 ,拦截器的调用也是典型的责任链模式

后期优化,通过数组,集合生成责任链更加实用

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/85256373