• java设计模式--职责链模式


    职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系。将这个对象连成一条线,并沿着这条链传递该请求,直到有一个对象处理它为止。

    我们看以下例子

    首先是一个请求类,这个请求有一个属性number,代表请假天数,请求将会被管理者处理。

    //请求类
    public class Request {
    
        //请假天数
        private int number;
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    }
    //管理者类,用来批准请求
    public class Mananger {
    
        //职位
        private String position;
    
        public Mananger(String position){
            this.position = position;
        }
    
        public void deal(Request request){
            if(position.equals("项目经理")){
                if(request.getNumber()<=2){
                    System.out.println(position+"同意请假"+request.getNumber()+"天");
                }else {
                    System.out.println(position+"无权处理请假"+request.getNumber()+"天");
                }
            }else if(position.equals("总监")){
                if(request.getNumber()<=4){
                    System.out.println(position+"同意请假"+request.getNumber()+"天");
                }else {
                    System.out.println(position+"无权处理请假"+request.getNumber()+"天");
                }
            }else if(position.equals("总经理")){
                if(request.getNumber()<=10){
                    System.out.println(position+"同意请假"+request.getNumber()+"天");
                }else {
                    System.out.println(position+"无权处理请假"+request.getNumber()+"天");
                }
            }
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            Request request = new Request();
            request.setNumber(7);
            Mananger mananger1 = new Mananger("项目经理");
            Mananger mananger2 = new Mananger("总监");
            Mananger mananger3 = new Mananger("总经理");
            mananger1.deal(request);
            mananger2.deal(request);
            mananger3.deal(request);
        }
    }

    测试结果:

    项目经理无权处理请假7天
    总监无权处理请假7天
    总经理同意请假7天

    上面这个例子只是完成了一个请求交付给不同的管理者处理的结果,但是这样设计的并不好,管理者里有很多的分值判断,所有管理者都用这一个类去判断,违背了单一职责原则,并且如果以后我们需要增加管理者类别还需要去修改这个类违背了开放-封闭原则。

    所以有了下面的职责链模式的例子:

    //请求类
    public class Request {
    
        //请假天数
        private int number;
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    }

    管理者抽象类

    public abstract class Manager {
        protected String name;
    
        //管理者的上级
        protected Manager superior;
    
        public Manager(String name){
            this.name = name;
        }
    
        public void setSuperior(Manager superior){
            this.superior = superior;
        }
    
        public abstract void Request(Request request);
    }

    具体管理者

    public class ConcreteManager1 extends Manager {
    
        public ConcreteManager1(String name) {
            super(name);
        }
    
        @Override
        public void Request(Request request) {
                if(request.getNumber()<=2){
                    System.out.println(name + "同意请假"+request.getNumber()+"天");
                }else {
                    if(superior!=null){
                        superior.Request(request);
                    }
                }
        }
    }
    public class ConcreteManager2 extends Manager {
    
        public ConcreteManager2(String name) {
            super(name);
        }
    
        @Override
        public void Request(Request request) {
            if(request.getNumber()<=4){
                System.out.println(name + "同意请假"+request.getNumber()+"天");
            }else {
                if(superior!=null){
                    superior.Request(request);
                }
            }
        }
    }
    public class ConcreteManager3 extends Manager {
    
        public ConcreteManager3(String name) {
            super(name);
        }
    
        @Override
        public void Request(Request request) {
            if(request.getNumber()<=10){
                System.out.println(name + "同意请假"+request.getNumber()+"天");
            }else {
                if(superior!=null){
                    superior.Request(request);
                }
            }
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            Manager manager1 = new ConcreteManager1("经理");
            Manager manager2 = new ConcreteManager2("总监");
            Manager manager3 = new ConcreteManager3("总经理");
    
            manager1.setSuperior(manager2);
            manager2.setSuperior(manager3);
    
            Request request = new Request();
            request.setNumber(7);
    
            manager1.Request(request);
    
        }
    }

    测试结果:总经理同意请假7天

    从上面的例子我们可以看到我们把条件判断放到了每一个具体的管理者类中,每一个管理者当自己处理不了请求时,就去调用另一个管理者的方法,以后如果添加新的管理者也变得方便了,实现了解耦。

  • 相关阅读:
    程序打印的日志哪里去了?结合slf4j来谈谈面向接口编程的重要性
    vue项目用npm安装sass包遇到的问题及解决办法
    nginx反向代理配置及常见指令
    你以为你以为的就是你以为的吗?记一次服务器点对点通知的联调过程
    jeecg逆向工程代码的生成及常见问题
    java注解
    终于有了,史上最强大的数据脱敏处理算法
    SpringBoot项目下的JUnit测试
    递归方法
    练习题
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11298572.html
Copyright © 2020-2023  润新知