JavaChainOfResponsibility模式
本文最后更新于:1 年前
推卸责任
1 - 表示发生的问题的类.它带有问题编号(number)
public class Trouble {
private int number; // 问题编号
public Trouble(int number){ // 生成问题
this.number = number;
}
public int getNumber(){
return number;
}
@Override
public String toString(){
return "[Trouble " + number + "]";
}
}
2 - 用来解决问题的抽象类
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 final void support(Trouble trouble){ // 解决问题的步骤
if (resolve(trouble)){
done(trouble);
}else if(next != null){
next.support(trouble);
}else{
fail(trouble);
}
}
@Override
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.");
}
}
3 - 用来解决问题的具体类(永远 “ 不处理问题 “)
public class NoSupport extends Support{
public NoSupport(String name){
super(name);
}
@Override
protected boolean resolve(Trouble trouble) { // 解决问题的方法
return false; // 自己什么也不做
}
}
4 - 用来解决问题的具体类(仅解决编号小于指定编号的问题)
public class LimitSupport extends Support{
private int limit;
public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
}
@Override
protected boolean resolve(Trouble trouble) {
return trouble.getNumber() < limit;
}
}
5 - 用来解决问题的具体类(仅解决奇数编号的问题)
public class OddSupport extends Support{
public OddSupport(String name) {
super(name);
}
@Override
protected boolean resolve(Trouble trouble) {
return trouble.getNumber() % 2 == 1;
}
}
6 - 用来解决问题的具体类(仅解决指定编号的问题)
public class SpecialSupport extends Support{
private int number;
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
@Override
protected boolean resolve(Trouble trouble) {
return trouble.getNumber() == number;
}
}
7 - 制作Support的职责链, 制造问题并测试程序行为
public class Main {
public static void main(String[] args) {
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob", 10);
Support charlie = new SpecialSupport("Charlie", 29);
Support diana = new LimitSupport("Diana", 20);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred", 30);
// 形成职责链
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);
for (int i = 0; i < 50; i++) {
alice.support(new Trouble(i));
}
}
}
8 - 输出示例
[Trouble 0] is resolved by [Bob].
[Trouble 1] is resolved by [Bob].
[Trouble 2] is resolved by [Bob].
[Trouble 3] is resolved by [Bob].
[Trouble 4] is resolved by [Bob].
[Trouble 5] is resolved by [Bob].
[Trouble 6] is resolved by [Bob].
[Trouble 7] is resolved by [Bob].
[Trouble 8] is resolved by [Bob].
[Trouble 9] is resolved by [Bob].
[Trouble 10] is resolved by [Diana].
[Trouble 11] is resolved by [Diana].
[Trouble 12] is resolved by [Diana].
[Trouble 13] is resolved by [Diana].
[Trouble 14] is resolved by [Diana].
[Trouble 15] is resolved by [Diana].
[Trouble 16] is resolved by [Diana].
[Trouble 17] is resolved by [Diana].
[Trouble 18] is resolved by [Diana].
[Trouble 19] is resolved by [Diana].
[Trouble 20] is resolved by [Fred].
[Trouble 21] is resolved by [Elmo].
[Trouble 22] is resolved by [Fred].
[Trouble 23] is resolved by [Elmo].
[Trouble 24] is resolved by [Fred].
[Trouble 25] is resolved by [Elmo].
[Trouble 26] is resolved by [Fred].
[Trouble 27] is resolved by [Elmo].
[Trouble 28] is resolved by [Fred].
[Trouble 29] is resolved by [Charlie].
[Trouble 30]cannot be resolved.
[Trouble 31] is resolved by [Elmo].
[Trouble 32]cannot be resolved.
[Trouble 33] is resolved by [Elmo].
[Trouble 34]cannot be resolved.
[Trouble 35] is resolved by [Elmo].
[Trouble 36]cannot be resolved.
[Trouble 37] is resolved by [Elmo].
[Trouble 38]cannot be resolved.
[Trouble 39] is resolved by [Elmo].
[Trouble 40]cannot be resolved.
[Trouble 41] is resolved by [Elmo].
[Trouble 42]cannot be resolved.
[Trouble 43] is resolved by [Elmo].
[Trouble 44]cannot be resolved.
[Trouble 45] is resolved by [Elmo].
[Trouble 46]cannot be resolved.
[Trouble 47] is resolved by [Elmo].
[Trouble 48]cannot be resolved.
[Trouble 49] is resolved by [Elmo].
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!