设计模式-职责链模式

发布于 2023-05-05 21:42:33 字数 2235 浏览 51 评论 0

我们总有请假的时候,每个单位可能制度都不一样,但都对请假时间长短有规定不同流程。例如 0.5-1 天假向经理报告,2-3 天假向 hr 报告,3以上的假期需总经理或老板签字等等。既然有这种状况,程序也务必会遇到此类情况,要说的就是处理此类问题时可能用到的设计模式——职责链模式。

示例,当前我有个请假的请求发送至上司,≤5天由 SimpleRequestHandler 处理,反之,SpecialRequestHandler 处理。

//请求
class Request {
    private String name;
    private int day;
    public Request(String name, int day) {
        this.name = name;
        this.day = day;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
}

//处理器抽象类
abstract class Handler {
    private Handler successor;
    public Handler getSuccessor() {
        return successor;
    }
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    abstract String handle(Request request);
}

//简易请求处理器
class SimpleRequestHandler extends Handler {
    @Override
    public String handle(Request request) {
    //加强健壮性,防止没有后续处理器而报空指针
        if(request.getDay() < 5 && getSuccessor() != null) {
            return getSuccessor().handle(request);
        }
        return request.getName() + "请≤5天假    >>>>>    批准";
    }
}

//特殊请求处理器
class SpecialRequestHandler extends Handler {
    @Override
    public String handle(Request request) {
        return request.getName() + "请≥5天假    >>>>>    批准";
    }
}

public class ChainOfResponsibility {
    public static void main(String[] args) {
    //TOM请≤5天假    >>>>>    批准
        Request request = new Request("TOM", 1);
    //TIM请≥5天假    >>>>>    批准
    Request request = new Request("TIM", 11);

        Handler handler = new SimpleRequestHandler();
        handler.setSuccessor(new SpecialRequestHandler());
        System.out.println(handler.handle(request));
    }
}

有上面 main 方法的三句代码可见的,对于每个请求来说,只需要面对一个处理器即可,大大的降低请求与处理的耦合。除此之外,也能让每个处理器有机会处理请求。

Handler handler = new SimpleRequestHandler();
handler.setSuccessor(new SpecialRequestHandler());
handler.handle(new Request("TOM", 1));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

御守

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文