职责链模式-设计模式

导读:本篇文章讲解 职责链模式-设计模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

动机

  1. 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能由一个接受者,如果显示指定,将比不可少的带来发送者和接受者的紧耦合。
  2. 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

模式定义

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

类图

在这里插入图片描述

要点总结

  1. Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,这时候请求发送者与接受着的耦合可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好的应对变化。
  2. 应了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
  3. 如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。

实例

项目组聚餐,经费申请,每级领导的审批的钱数不一样;我们申请的经费不确定是哪个领导批,申请请求在不同的领导直接流转,直到其中一个批准为止。

  1. 创建抽象处理类,类中包含下一个处理类的引用。
public abstract class AbstractHandler {
    protected AbstractHandler nextHandler;

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract String handler(String user, double fee);
}
  1. 分别实现项目经理、部门经理、总经理的处理类
public class ProjectManager extends AbstractHandler {

    @Override
    public String handler(String user, double fee) {
        String result = null;

        if (fee < 500) {
            result = "project ratify, user:" + user + ", fee:" + fee;
        } else {
            if (this.nextHandler != null) {
                result = this.nextHandler.handler(user, fee);
            }
        }
        return result;
    }
}
public class DeptManager extends AbstractHandler {

    @Override
    public String handler(String user, double fee) {
        String result = null;

        if (fee < 1000) {
            result = "Department ratify, user:" + user + ", fee:" + fee;
        } else {
            if (this.nextHandler != null) {
                result = this.nextHandler.handler(user, fee);
            }
        }
        return result;
    }
}
public class GeneralManager extends AbstractHandler {

    @Override
    public String handler(String user, double fee) {
        String result = null;

        if (fee < 10000) {
            result = "General ratify, user:" + user + ", fee:" + fee;
        } else {
            if (this.nextHandler != null) {
                result = this.nextHandler.handler(user, fee);
            }
        }
        return result;
    }
}
  1. 客户使用类,自己组合调用的职责链,并向其中一个处理这发送请求。
public class Client {
    public static void main(String[] args) {
        AbstractHandler project = new ProjectManager();
        AbstractHandler dept = new DeptManager();
        AbstractHandler general = new GeneralManager();
        project.setNextHandler(dept);
        dept.setNextHandler(general);
        System.out.println(project.handler("wx", 2000));
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100399.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!