Java代码实现责任链模式
优点:1.降低耦合度,将请求的发送者和接收者解耦;2.简化了对象,使得对象不需要知道链的结构;3.增强了系统的可扩展性,可以增加新的请求处理类;4.增加新的请求处理类很方便,无需修改原有代码;5.灵活性增强,可以根据需要自由组合链和具体处理类;6.可以对请求的处理顺序进行灵活的控制。
缺点:1.不能保证每个请求一定被处理;2.对于比较长的责任链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响;3.责任链建立的合理性要靠客户端来保证,增加了客户端的复杂性;4.可能会造成循环调用,导致系统陷入死循环。
// 定义抽象处理者
abstract class Handler {
protected Handler successor; // 下一个处理者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
// 具体处理者1
class ConcreteHandler1 extends Handler {
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println(this.getClass().getName() + " 处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理者2
class ConcreteHandler2 extends Handler {
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println(this.getClass().getName() + " 处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理者3
class ConcreteHandler3 extends Handler {
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println(this.getClass().getName() + " 处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 组装责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
// 发送请求
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
for (int request : requests) {
handler1.handleRequest(request);
}
}
}