欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

大话设计模式笔记(二十一)の职责链模式

程序员文章站 2022-05-28 22:15:12
职责链模式 定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 UML图 好处 当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler 对象负责处理它 接收者和发送者都没有对方 ......

职责链模式

定义

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

uml图

大话设计模式笔记(二十一)の职责链模式

好处

  • 当客户提交一个请求时,请求是沿链传递直至有一个 concretehandler 对象负责处理它
  • 接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果时职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持他所有的候选者接收者的引用。
  • 可以随时的增加或修改一个请求的结构,增强给对象指派职责的灵活性

但需要注意的是:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

举个栗子

员工申请加薪,需要走流程

talk is cheap, show me the code

(屁话少说,放码过来)

/**
 * 管理者
 * created by callmedevil on 2019/12/14.
 */
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 requestapplications(request request);

}
/**
 * 经理
 * created by callmedevil on 2019/12/14.
 */
public class commonmanager extends manager {

    public commonmanager(string name) {
        super(name);
    }

    @override
    public void requestapplications(request request) {
        // 经理的权限可以批准2天内的假期
        if ("请假".equals(request.getrequesttype()) && request.getnumber() <= 2) {
            system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber()));
        } else {
            // 其余申请转交上级
            if (superior != null) {
                superior.requestapplications(request);
            }
        }
    }

}
/**
 * 总监
 * created by callmedevil on 2019/12/14.
 */
public class majordomo extends manager {

    public majordomo(string name) {
        super(name);
    }

    @override
    public void requestapplications(request request) {
        // 总监的权限可以批准5天内的假期
        if ("请假".equals(request.getrequesttype()) && request.getnumber() <= 5) {
            system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber()));
        } else {
            // 其余申请转交上级
            if (superior != null) {
                superior.requestapplications(request);
            }
        }
    }

}
/**
 * 总经理
 * created by callmedevil on 2019/12/14.
 */
public class generalmanager extends manager {

    public generalmanager(string name) {
        super(name);
    }

    @override
    public void requestapplications(request request) {
        // 总经理可以批准任意天的假期
        if ("请假".equals(request.getrequesttype())) {
            system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber()));
        }
        // 加薪在500内,没问题
        else if ("加薪".equals(request.getrequesttype()) && request.getnumber() <= 500) {
            system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber()));
        }
        // 加薪超过500要考虑一下
        else if ("加薪".equals(request.getrequesttype()) && request.getnumber() > 500) {
            system.out.println(string.format("%s : %s 数量%s 再说吧", name, request.getrequestcontent(), request.getnumber()));
        }
    }

}
/**
 * 申请类
 * created by callmedevil on 2019/12/14.
 */
public class request {

    // 申请级别
    private string requesttype;
    // 申请内容
    private string requestcontent;
    // 数量
    private int number;

    // 省略get set
}
public class test {
    public static void main(string[] args) {
        commonmanager commonmanager = new commonmanager("中将");
        majordomo majordomo = new majordomo("大将");
        generalmanager generalmanager = new generalmanager("元帅");
        // 设置上级
        commonmanager.setsuperior(majordomo);
        majordomo.setsuperior(generalmanager);

        request request = new request();
        request.setrequesttype("请假");
        request.setrequestcontent("不给请假我不干了");
        request.setnumber(1);
        commonmanager.requestapplications(request); // 客户端的申请都是由经理发起的,但实际上决策是谁,客户端不知道

        request request2 = new request();
        request2.setrequesttype("请假");
        request2.setrequestcontent("不给请假我不干了");
        request2.setnumber(4);
        commonmanager.requestapplications(request2);

        request request3 = new request();
        request3.setrequesttype("加薪");
        request3.setrequestcontent("不给加薪我不干了");
        request3.setnumber(500);
        commonmanager.requestapplications(request3);

        request request4 = new request();
        request4.setrequesttype("加薪");
        request4.setrequestcontent("不给加薪我不干了");
        request4.setnumber(1000);
        commonmanager.requestapplications(request4);
    }
}

运行结果

中将 : 不给请假我不干了 数量1 被批准
大将 : 不给请假我不干了 数量4 被批准
元帅 : 不给加薪我不干了 数量500 被批准
元帅 : 不给加薪我不干了 数量1000 再说吧