Chain of Responsibility パターン

  1. 概要
     
    1. 問題
       サポートやヘルプを行うとき、全体を統括するのは困難で、まず、適当な部門に回し、そこで、処理できなければ、次の部門へ、と順にまわしていく方法がとられます。

       
    2. 手法
       このパターンのクラスには、次の処理部門を定める
       public Support setNext()
      と、その部門での処理を行う
       public void support(Trouble trouble)
      メソッドが最低必要です。

  2. 例 Support

    1. Supportクラス
      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);
              } 
          }
      
          protected abstract boolean resolve(Trouble trouble); // 解決用メソッド
          protected void done(Trouble trouble) {  // 解決
              System.out.println(trouble + " is resolved by " + this + ".");
          }
      
      }

    2. Singletonの生成とインスタンスの生成時期
       特定の番号以下をサポートする実クラスです。
      public 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;
              }
          }
      }