When a client issues a request, the request propagates (传播) along the chain until a ConcreteHandler object takes responsibility for handling it.
当客户端发出请求时,请求沿链传播(传播),直到某个 ConcreteHandler 对象负责处理它。
public abstract class Support {private String name; // 解决问题的实例的名字private Support next; // 要推卸给的对象public Support(String name) { // 生成解决问题的实例this.name = name;}public Support setNext(Support next) { // 设置要推卸给的对象this.next = next;return next;}public void support(Trouble trouble) {for (Support obj = this; true; obj = obj.next) {if (obj.resolve(trouble)) {obj.done(trouble);break;} else if (obj.next == null) {obj.fail(trouble);break;}}}public String toString() { // 显示字符串return "[" + name + "]";}protected abstract boolean resolve(Trouble trouble); // 解决问题的方法protected void done(Trouble trouble) { // 解决System.out.println(trouble + " is resolved by " + this + ".");}protected void fail(Trouble trouble) { // 未解决System.out.println(trouble + " cannot be resolved.");}
}
public class NoSupport extends Support {public NoSupport(String name) {super(name);}protected boolean resolve(Trouble trouble) { // 解决问题的方法return false; // 自己什么也不处理}
}
public class OddSupport extends Support {public OddSupport(String name) { // 构造函数super(name);}protected boolean resolve(Trouble trouble) { // 解决问题的方法if (trouble.getNumber() % 2 == 1) {return true;} else {return false;}}
}
public class SpecialSupport extends Support {private int number; // 只能解决指定编号的问题public SpecialSupport(String name, int number) { // 构造函数super(name);this.number = number;}protected boolean resolve(Trouble trouble) { // 解决问题的方法if (trouble.getNumber() == number) {return true;} else {return false;}}
}
public class LimitSupport extends Support {private int limit; // 可以解决编号小于limit的问题public LimitSupport(String name, int limit) { // 构造函数super(name);this.limit = limit;}protected boolean resolve(Trouble trouble) { // 解决问题的方法if (trouble.getNumber() < limit) {return true;} else {return false;}}
}
public class Trouble {private int number; // 问题编号public Trouble(int number) { // 生成问题this.number = number;}public int getNumber() { // 获取问题编号return number;}public String toString() { // 代表问题的字符串return "[Trouble " + number + "]";}
}
public class Main {public static void main(String[] args) {Support alice = new NoSupport("Alice_NoSupport");Support bob = new LimitSupport("Bob_LimitSupport", 100); //只能处理100以下的数Support charlie = new SpecialSupport("Charlie_SpecialSupport", 429); //只能处理429这一个数Support diana = new LimitSupport("Diana_LimitSupport", 200); //只能处理200以下的数Support elmo = new OddSupport("Elmo_OddSupport"); //只能处理奇数Support fred = new LimitSupport("Fred_LimitSupport", 300); //只能处理三百以下的数// 形成职责链alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);// 制造各种问题for (int i = 0; i < 500; i += 33) {alice.support(new Trouble(i));}}
}