责任链模式(Chain_of_Responsbility)_Java实现

// 20210202
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现责任链模式

责任链模式核心思想

  • 如其字面意思,一个链式结构,通俗来讲,就是每一层元素只有两个选择
    • 权限够,直接通过请求,并作出相应动作
    • 权限不够,抛给上级

程序源代码

  • 此处实现公司加薪和请假系统,具体成员&规则如下:
    • 经理:只能批准两天以下的请假
    • 总监:只能批准五天以下的请假
    • 总经理:
      • 只能批准50天以下的假期
      • 接受500元以下的加薪
    • 董事长:可以批准100天以下的假期,100天以上直接让他滚蛋


/**
 * 处理者父类
 */
public abstract class Manager {
    protected String name;
    protected Manager superManager = null;//该管理者的上级
    protected String position_name;

    //构造必须写名字,不提供咋再从外部设置名字的机会
    public Manager(String name,String position_name){
        this.name = name;
        this.position_name = position_name;
    }

    public void setSuperManager(Manager superManager) {
        this.superManager = superManager;
    }

    //申请请求
    public abstract void handlerRequest(Request request);
}

/**
 * 请求类
 */
public class Request {
    private String requestType;//申请类别
    private String requestContent;//申请内容
    private int number;//数量
    private String applicant_name;

    public Request(String requestType,int number,String applicant_name){
        this.requestType = requestType;
        this.number = number;
        this.applicant_name = applicant_name;
    }

    public String getRequestType() {
        return requestType;
    }


    public String getRequestContent() {
        return requestContent;
    }

    public void setRequestContent(String requestContent) {
        //在此处将名字和请求类型以及内容合并
        this.requestContent = "["+applicant_name+"]_"+requestType+":"+requestContent;
    }

    public int getNumber() {
        return number;
    }

}

/**
 * 经理类
 */
public class CommomManager extends Manager{

    public CommomManager(String name,String position_name){
        super(name,position_name);
    }

    @Override
    public void handlerRequest(Request request) {
        if(request.getRequestType().equals("请假")
        &&request.getNumber()<=2){
            //小于等于两天的请假申请可以批
            System.out.println("("+position_name+")"
                    +name+":" + request.getRequestContent()+
                    ",时长:"+request.getNumber()+"天,被批准");
        }else {
            //其余交给上级批准
            if(superManager!=null){
                superManager.handlerRequest(request);
            }else{
                System.out.println("系统出现错误,请联系管理员...");
            }
        }
    }
}

/**
 * 总监类
 */
public class Majordomo extends Manager {

    public Majordomo(String name,String position_name){
        super(name,position_name);
    }

    @Override
    public void handlerRequest(Request request) {
        if(request.getRequestType().equals("请假")
        && request.getNumber()<=5){
            System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
        }else{//其余请求申请上级
            if(superManager!=null){
                superManager.handlerRequest(request);
            }else{
                System.out.println("系统出现错误,请联系管理员...");
            }
        }
    }
}

/**
 * 总经理类
 */
public class GeneralManager extends Manager {

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

    @Override
    public void handlerRequest(Request request) {
        if(request.getRequestType().equals("请假")){
            if(request.getNumber() < 50)
                //总经理能批小于50天的假期
                System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
            else
                superManager.handlerRequest(request);
        }else if(request.getRequestType().equals("加薪")) {
            if (request.getNumber() <= 500)
                System.out.println("("+position_name+")"+name + ":" + request.getRequestContent() + ",金额:¥" + request.getNumber() + ",被批准");
            else
                System.out.println("("+position_name+")"+name + ":" + request.getRequestContent() + ",金额:¥" + request.getNumber() + ",再说吧");

        }//判断条件优化,防止每次判断三次
    }
}

/**
 * 董事长类
 */
public class Chairman extends Manager{

    public Chairman(String name,String position_name){
        super(name,position_name);
    }

    @Override
    public void handlerRequest(Request request) {
        if(request.getRequestType().equals("请假")){
            //董事长能批100天以下的假期,以上直接让其滚蛋
            if(request.getNumber()<=100)
                System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
            else
                System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,去财务办个手续,收拾收拾东西滚蛋吧");

        }else {
            System.out.println("请正确填写需求");
        }
    }
}

/**
 * 测试主类
 */
public class Main {
    public static void main(String[] args) {
        CommomManager commomManager = new CommomManager("张三","经理");
        GeneralManager generalManager = new GeneralManager("李四","总经理");
        Majordomo majordomo = new Majordomo("王五","总监");
        Chairman chairman = new Chairman("李六","董事长");

        //设置经理的上级为总监
        commomManager.setSuperManager(majordomo);
        //设置总监的上级为总经理
        majordomo.setSuperManager(generalManager);
        //设置总经理的上级为董事长
        generalManager.setSuperManager(chairman);

        Request request_01 = new Request("请假",1,"John");
        request_01.setRequestContent("家里有点事想请个假");
        commomManager.handlerRequest(request_01);

        Request request_02 = new Request("请假",4,"Mike");
        request_02.setRequestContent("家里有亲人结婚");
        commomManager.handlerRequest(request_02);

        Request request_03 = new Request("请假",10,"Lucy");
        request_03.setRequestContent("生病了请假住个院");
        commomManager.handlerRequest(request_03);

        Request request_04 = new Request("请假",40,"Jar_Chen");
        request_04.setRequestContent("老婆生孩子了请产假");
        commomManager.handlerRequest(request_04);

        Request request_05 = new Request("请假",101,"Uncle_Joe");
        request_05.setRequestContent("没啥事儿,就想让董事长知道我的名字");
        commomManager.handlerRequest(request_05);

        Request request_06 = new Request("加薪",400,"God");
        request_06.setRequestContent("我觉得我的能力值这个价钱");
        commomManager.handlerRequest(request_06);

        Request request_07 = new Request("加薪",1000,"Check_To");
        request_07.setRequestContent("爸爸天下第一!");
        commomManager.handlerRequest(request_07);
    }
}

  • 输出如下:

以上
希望对大家有所帮助

原文地址:https://www.cnblogs.com/lavender-pansy/p/14363922.html