设计模式之职责链模式

  1. 简单梳理职责链模式
    1. 职责链模式的实现
      1. 定义业务方法
      2. 执行结果
      3. 结果分析
  2. 联系作者
    1. 微信公众号
    2. QQ群

简单梳理职责链模式

职责链模式的实现

我们在公司中,经常需要提交各种申请流程,比如休假或者涨薪申请。
但通常我们得申请也并是都能被我们得直属领导直接审批,而是需要层层请示。

我们来看下这种生活场景如何用设计模式来实现。

请求类,用来记录请求类型内容和数量等

public class Request {
    private String requestType;
    private String requestContent;
    private int number;

    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public String getRequestContent() {
        return requestContent;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    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 RequestApplication(Request request);
}

经理类,作为直属领导得实现

//经理
public class CommonManager extends Manager{
    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void RequestApplication(Request request) {
        if(request.getRequestType().equals("请假")&&request.getNumber()<=2){
            System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
        }else{
            if(superior!=null){
                superior.RequestApplication(request);
            }
        }
    }
}

总监类,作为经理类得上级

//总监
public class Majordomo extends Manager{
    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void RequestApplication(Request request) {
        if(request.getRequestType().equals("请假")&&request.getNumber()<=5){
            System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
        }else{
            if(superior!=null){
                superior.RequestApplication(request);
            }
        }
    }
}

总经理类,作为最高领导,有权决定一切

//总经理
public class GeneraManager extends Manager{
    public GeneraManager(String name) {
        super(name);
    }

    @Override
    public void RequestApplication(Request request) {
        if(request.getRequestType().equals("请假")){
            System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
        }else if(request.getRequestType().equals("加薪")&&request.getNumber()<=500){
            System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
        }else if(request.getRequestType().equals("加薪")&&request.getNumber()>500){
            System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"再说吧。");
        }
    }
}

这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。

定义业务方法

看在具体业务逻辑中如何使用

public class ChainTest {
    public static void main(String[] args) {
        //职责链模式
        func1();
    }

    public static void func1(){
        CommonManager jingli = new CommonManager("经理");
        Majordomo zongjian = new Majordomo("总监");
        GeneraManager zongjingli = new GeneraManager("总经理");
        jingli.setSuperior(zongjian);
        zongjian.setSuperior(zongjingli);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("员工请假");
        request.setNumber(1);
        jingli.RequestApplication(request);

        Request request2 = new Request();
        request2.setRequestType("请假");
        request2.setRequestContent("员工请假");
        request2.setNumber(4);
        jingli.RequestApplication(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("员工加薪申请");
        request3.setNumber(500);
        jingli.RequestApplication(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("员工加薪申请");
        request4.setNumber(1000);
        jingli.RequestApplication(request4);
    }
}

执行结果

经理:员工请假数量 1被批准。
总监:员工请假数量 4被批准。
总经理:员工加薪申请数量 500被批准。
总经理:员工加薪申请数量 1000再说吧。

结果分析

职责链模式,使多个对象都有机会处理请求,从而避免请求得发起者和接收者之间耦合。
将这个对象连城一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界