职责链模式(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天的请假
职责链模式与状态模式
两个模式的表现十分类似,都是通过定义一个基类实现各种判断的解耦。
不过职责链模式把各种分支的关系交给调用方处理,分支间的关系可以比较灵活处理,但是也可能因为调用方操作不当导致出错的问题。
状态模式则是把分支间的关系直接耦合在分支当中了,调用方无法去修改分支间的关系,不过调用方也节省了设置分支关系的步骤,直接调用即可。