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 协议 ,转载请注明出处!