《大话设计模式》java实现之责任链模式

本文通过一个具体的请假审批流程实例,详细介绍了责任链模式的应用。该模式允许请求沿着处理者链传递,直到找到能够处理它的对象。文章展示了如何通过设置上级处理者来构建链条,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

责任链模式各个对象的下一个处理对象在客户端指定,可以自由组合,灵活性强,状态模式各状态则是在编译时设置,即在各状态对象中指定,可对比struts的filter。
另外,书中变量的命名如jingli、zongjian、zongjingli这些是为了让读者区分,实际上不推荐使用拼音命名,我觉得还不如在name属性中设置成经理、总监、总经理比使用金利、宗剑这些要好
UML
这里写图片描述
代码结构
这里写图片描述

public class Client {
    public static void main(String[] args) {
        CommonManager jinli = new CommonManager("金利");
        Majordomo zongjian = new Majordomo("宗剑");
        GeneralManager zongjingli = new GeneralManager("钟精励");
        jinli.setSuperior(zongjian);
        zongjian.setSuperior(zongjingli);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("小菜请假");
        request.setNumber(1);
        jinli.requestApplications(request);

        Request request2 = new Request();
        request2.setRequestType("请假");
        request2.setRequestContent("小菜请假");
        request2.setNumber(4);
        jinli.requestApplications(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("小菜请求加薪");
        request3.setNumber(500);
        jinli.requestApplications(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("小菜请求加薪");
        request4.setNumber(1000);
        jinli.requestApplications(request4);
    }
}
public class CommonManager extends Manager {

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

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

}
//总经理
public class GeneralManager extends Manager {

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

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

}
//总监
public class Majordomo extends Manager {

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

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

}
public abstract class Manager {
    protected String name;

    public Manager(String name) {
        super();
        this.name = name;
    }

    private Manager superior;

    public Manager getSuperior() {
        return superior;
    }

    public void setSuperior(Manager superior) {  //关键的方法
        this.superior = superior;
    }

    public abstract void requestApplications(Request request);
}
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;
    }

}

运行结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值