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

一、概述

       职责链模式(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总经理
拒绝请求!拒绝人:总经理。

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值