设计模式-职责链模式

设计模式-职责链模式

1、简单介绍

职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。

2、主要涉及到的角色

  • 抽象处理者(Handler)角色:抽象处理者用于定义出一个处理请求的接口,如果需要,接口可以定义出一个方法,以返回对下一个处理对象的引用。上面例子中的Approver就是代表的这个角色。

  • 具体处理者(ConcreteHandler)角色:处理接到的请求,可以选择将请求处理掉,或者将请求传递给下家。上面的例子中的Manager和TechnicalDirector以及CEO就是代表的这个角色。

3、案例分析(公司文件审批)

1)抽象处理者(Handler)
public abstract class Review {

    private Review review;

    public void setNextUser(Review review) {
        this.review = review;
    }

    public Review getNextUser() {
        return review;
    }

    // 传递的过程
    public abstract void handle(String str);

}

2)具体处理者
//部门经理
public class DepartmentManager extends Review {

    @Override
    public void handle(String str) {
        System.out.println(str + "DepartmentManager处理完成");
        Review nextUser = getNextUser();
        if (nextUser != null) {
            nextUser.handle(str);
        } else {
            System.out.println(str + "通过");
        }

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

    @Override
    public void handle(String str) {
        System.out.println(str + "GeneralManager处理完成");
        Review nextUser = getNextUser();
        if (nextUser != null) {
            nextUser.handle(str);
        } else {
            System.out.println(str + "通过");
        }

    }

   
}
3)测试
 public static void main(String[] args) {
        DepartmentManager departmentManager = new DepartmentManager();
        GeneralManager generalManager = new GeneralManager();
        departmentManager.setNextUser(generalManager);
        System.out.println("文件发起流程");
        departmentManager.handle("文件");

    }

20200116165531

4、总结

  • 责任链模式的优点
1)、请求不需要指出被哪个对象处理了,这样的效果是请求者和接收者之间的解耦,而且链中的对象也不需要清楚其他链的结构,也降低了耦合。
2)、请求处理对象仅需要维护一个指向其后继者的的引用,而不需要维护所有的处理对象,简化了对象之间的相互连接。
3、在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。
4)、新增一个请求处理对象,不需要改动现有代码,只需要重新设置连接即可,符合“开闭原则”。
  • 责任链模式的缺点
1)、如果一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。
2)、 对于比较长的职责链,请求的处理可能涉及到多个处理对象,不仅增加了代码的复杂性并且系统性能也将受到一定影响,而且在进行代码调试时不太方便。
3)、若建链不当,可能会造成循环调用,将导致系统陷入死循环。

5、突然明白之前用的filter和oauth2的验证就是这种模式。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.fengpt.cn/archives/设计模式-职责链模式