天天看点

设计模式梳理——职责链模式

一、概述

       职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免发送者与接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 。

二、UML图示

设计模式梳理——职责链模式

三、代码实现

1、管理者

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(RequestMes requestMes);
}
           

2、具体管理者

//经理
public class CommonManager extends Manager {

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

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 2){
            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);
        }else {
            if (null != superior){
                superior.requestApplication(requestMes);
            }
        }
    }
}

//总监
public class Majordomo extends Manager {

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

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 5){
            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);
        }else {
            if (null != superior){
                superior.requestApplication(requestMes);
            }
        }
    }
}

//总经理
public class GeneralManager extends Manager {

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

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 10){
            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);
        }else if(requestMes.getRequestType().equals("加薪") && requestMes.getRequestNum() < 1000){
            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,加薪数量为:"+requestMes.getRequestNum()+" 批准人:"+this.name);
        }
        else {
            System.out.println("拒绝请求!拒绝人:总经理。");
        }
    }
}
           

3、请求

public class RequestMes {

    private String requestType;

    private String requestContent;

    private int requestNum;

    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 getRequestNum() {
        return requestNum;
    }

    public void setRequestNum(int requestNum) {
        this.requestNum = requestNum;
    }
}
           

4、测试类

public class Test {

    public static void main(String[] args) {
        CommonManager m1 = new CommonManager("aa经理");
        Majordomo m2 = new Majordomo("bb总监");
        GeneralManager m3 = new GeneralManager("cc总经理");

        m1.setSuperior(m2);
        m2.setSuperior(m3);

        RequestMes requestMes1 =new RequestMes();
        requestMes1.setRequestType("请假");
        requestMes1.setRequestContent("小新请假");
        requestMes1.setRequestNum(1);
        m1.requestApplication(requestMes1);

        RequestMes requestMes2 =new RequestMes();
        requestMes2.setRequestType("请假");
        requestMes2.setRequestContent("小新请假");
        requestMes2.setRequestNum(4);
        m1.requestApplication(requestMes2);

        RequestMes requestMes3 =new RequestMes();
        requestMes3.setRequestType("请假");
        requestMes3.setRequestContent("小新请假");
        requestMes3.setRequestNum(8);
        m1.requestApplication(requestMes3);

        RequestMes requestMes4 =new RequestMes();
        requestMes4.setRequestType("加薪");
        requestMes4.setRequestContent("小新加薪");
        requestMes4.setRequestNum(800);
        m1.requestApplication(requestMes4);

        RequestMes requestMes5 =new RequestMes();
        requestMes5.setRequestType("加薪");
        requestMes5.setRequestContent("小新加薪");
        requestMes5.setRequestNum(1800);
        m1.requestApplication(requestMes5);

    }
}

输出:
aa经理,您的请假审批通过,请假天数为:1 批准人:aa经理
bb总监,您的请假审批通过,请假天数为:4 批准人:bb总监
cc总经理,您的请假审批通过,请假天数为:8 批准人:cc总经理
cc总经理,您的加薪审批通过,加薪数量为:800 批准人:cc总经理
拒绝请求!拒绝人:总经理。
           

注:参考文献《大话设计模式》程杰著。

继续阅读