设计模式之职责链模式

xiaoxiao2021-02-28  119

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

可以定义一个抽象类来表示处理事件的对象,这个类首先有个处理事件的抽象方法,然后提供一个方法设置下一级处理者。每个处理者只要知道下一个处理者是谁就可以了,耦合度很低,类似链表结构。

处理者类,处理方法的参数可以根据实际需要设置类型:

public abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handle(int request); }

具体处理类:

class Manager extends Handler { @Override public void handle(int request) { if (request <= 3) { System.out.println("经理同意了" + request + "天的请假"); } else if (successor != null) { System.out.println("请假天数超过经理权限"); successor.handle(request); } } } class Director extends Handler { @Override public void handle(int request) { if (request <= 7) { System.out.println("总监同意了" + request + "天的请假"); } else if (successor != null) { System.out.println("请假天数超过总监权限"); successor.handle(request); } } } class GeneralManager extends Handler { @Override public void handle(int request) { if (request <= 30) { System.out.println("总经理同意了" + request + "天的请假"); } else { System.out.println("总经理拒绝了" + request + "天的请假"); } } }

测试类:

public class Main { public static void main(String[] args) { final Manager manager = new Manager(); final Director director = new Director(); final GeneralManager generalManager = new GeneralManager(); manager.setSuccessor(director); director.setSuccessor(generalManager); manager.handle(2); System.out.println(); manager.handle(7); System.out.println(); manager.handle(21); System.out.println(); manager.handle(40); System.out.println(); } }

输出:

经理同意了2天的请假 请假天数超过经理权限 总监同意了7天的请假 请假天数超过经理权限 请假天数超过总监权限 总经理同意了21天的请假 请假天数超过经理权限 请假天数超过总监权限 总经理拒绝了40天的请假

职责链模式与状态模式

两个模式的表现十分类似,都是通过定义一个基类实现各种判断的解耦。

不过职责链模式把各种分支的关系交给调用方处理,分支间的关系可以比较灵活处理,但是也可能因为调用方操作不当导致出错的问题。

状态模式则是把分支间的关系直接耦合在分支当中了,调用方无法去修改分支间的关系,不过调用方也节省了设置分支关系的步骤,直接调用即可。

转载请注明原文地址: https://www.6miu.com/read-67238.html

最新回复(0)