1.责任链,首先存在一个责任链,有一个问题,下面开始解决这个问题。从责任链的第一个节点开始来解决这个问题,如果这个节点不能解决,那么用下一个节点来解决,如果整个责任链都没有可以解决该问题的方法,那么就failed。
2.这个模式比较简单明了,下面是一个例子:
package com.cn;
class Trouble {
private int number;
public Trouble(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public String toString() {
return "[Trouble " + number + "]";
}
}
abstract class Support {
private String name;
private Support next;
public Support(String name) {
this.name = name;
}
public Support setSupport(Support next) {
this.next = next;
return next;
}
public final void support(Trouble trouble) {
if (resolve(trouble)) {
done(trouble);
}
else if (next != null) {
next.support(trouble);
}
else {
fail(trouble);
}
}
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 resovled.");
}
}
class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble) {
return false;
}
}
class LimitSupport extends Support {
private int 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;
}
}
}
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;
}
}
}
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 Main {
public static void main(String[] args) {
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob",100);
Support charlie = new SpecialSupport("Charlie",429);
Support diana = new LimitSupport("Diana",200);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred",300);
//create the chain of responsibility
alice.setSupport(bob).setSupport(charlie).setSupport(diana).setSupport(elmo).setSupport(fred);
for (int i = 0; i < 500; i += 33) {
alice.support(new Trouble(i));
}
}
}