責任連鎖


つ以上のオブジェクトに要求を処理する機会を与えることによって、受信機に要求の送付者を結合しないようにしてください.受け取ったオブジェクトをチェインし、オブジェクトがそれを処理するまで、チェーンに沿ってリクエストを渡します.

参加者

  • Handler :リクエストを処理するインターフェイスを定義します.
    (オプション)後継リンク
  • を実装します.
  • ConfiteHandler :ハンドルは、それが責任があると要求します.はその後継者にアクセスできる.具体的なハンドラがリクエストを処理できるなら、そうします;さもなければ、それはその後継者に要求を転送します.
  • Client :このリクエストをチェイン上のConcreteHandlerオブジェクトに初期化します.
  • コード


    public class Main {
    
        public static void main(String[] args) {
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            h1.setSuccessor(h2);
            h2.setSuccessor(h3);
            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
    
            for (int request : requests) {
                h1.handleRequest(request);
            }
    
        }
    }
    
    public abstract class Handler {
    
        protected Handler successor;
    
        public void setSuccessor(Handler successor) {
            this.successor = successor;
        }
    
        abstract void handleRequest(int request);
    }
    
    public class ConcreteHandler1 extends Handler {
    
        @Override
        public void handleRequest(int request) {
            if (request >= 0 && request < 10) {
                System.out.println(this.getClass().getSimpleName() + " handled request " + request);
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    
    public class ConcreteHandler2 extends Handler {
    
        @Override
        public void handleRequest(int request) {
            if (request >= 10 && request < 20) {
                System.out.println(this.getClass().getSimpleName() + " handled request " + request);
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    
    public class ConcreteHandler3 extends Handler {
    
        @Override
        public void handleRequest(int request) {
            if (request >= 20 && request < 30) {
                System.out.println(this.getClass().getSimpleName() + " handled request " + request);
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    

    出力


    ConcreteHandler1 handled request 2
    ConcreteHandler1 handled request 5
    ConcreteHandler2 handled request 14
    ConcreteHandler3 handled request 22
    ConcreteHandler2 handled request 18
    ConcreteHandler1 handled request 3
    ConcreteHandler3 handled request 27
    ConcreteHandler3 handled request 20
    

    エディエルジュリアン61 / デザインパターン