zoukankan      html  css  js  c++  java
  • 责任链模式(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);
        }
    }
    
    
    • 输出如下:

    以上
    希望对大家有所帮助

  • 相关阅读:
    开源的免费的对比工具
    win10 git bash 配置
    Java SSH 不使用终端也能调用环境变量中的指令
    MySQL WITH ROLLUP
    docker安装postgres
    开源的应用容器引擎
    清除浮动有哪几种方法
    js中的yield
    git的速学了解
    string/stringBuffer/StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14363922.html
Copyright © 2011-2022 走看看