コミックデザインパターン:「責任の連鎖パターン」とは何ですか?

- - - 次の日 - - -


————————————

会社には、Little A、Little B、LittleCという名前の3人のプログラマーがいます。

ある日、会社の新製品マネージャーに新しい要件がありましたが、彼女はこの要件の責任者を知りませんでした。それで、彼女は最初に小さなAを見つけました:

したがって、製品マネージャーは再び小さなBを見つけました。

したがって、製品マネージャーは再び小さなCを見つけました。

このようにして、タスクは小さなAから小さなBに、小さなBから小さなCに転送され、最後に小さなCによって処理され、完全なタスク処理チェーンが形成されます。

上記のチェーンには、さまざまなタスクハンドラーがあります。新しいタスクに直面した場合、各タスクプロセッサは、タスクを処理できるかどうかを判断し、処理できるかどうかを判断してから、処理して戻る必要があります。処理できない場合は、特定のタスクプロセッサが最終的に完了するまで、次のタスクプロセッサに転送します。扱う。これは責任連鎖モデルの中心的なアイデアです。


abstract public class Handler {

    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    abstract String handleRequest(String msg);
}

上記の抽象クラスからわかるように、各Handlerオブジェクトには、リンクリストノードの次のポインターと同様に、次のタスクハンドラーを指す後続メンバーが含まれています。

public class HandlerA extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("a")){
            msg = msg.replace('a', '*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}

public class HandlerB extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("b")){
            msg = msg.replace('b', '*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}

public class HandlerC extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("c")){
            msg = msg.replace('c', '*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}

これらの3つのハンドラー実装クラスでは、同様の判断が行われます。

受信メッセージ文字列に特定の文字が含まれている場合は、対応する文字を*に置き換えます。ハンドラーが担当する文字を置き換えると、リンク全体が直接終了します。担当する文字がない場合は、次のハンドラーが処理を続行するように指定されます。

public class Client {

    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        Handler handlerC = new HandlerC();

        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        System.out.println(handlerA.handleRequest("apple"));
        System.out.println(handlerA.handleRequest("bicycle"));
        System.out.println(handlerA.handleRequest("color"));
    }
}

クライアントコードでは、リンク全体とプロセッサの順序を柔軟に設定してから、最初のプロセッサのhandleRequestメソッドを直接呼び出すことができます。これは、リンク全体を開始するのと同じです。


Web開発を行った友人は、クライアントがHTTP要求をWebアプリケーションに送信すると、最初にTomcatコンテナのフィルタ(フィルタ)を通過することを知っています。フィルタは、要求されたアクセス権、パラメータの正当性などに基づいています。アスペクトが検証およびフィルタリングされます。

このフィルター層の実現には、責任連鎖モデルが使用されます。

SpringMVCフレームワークのソースコードに精通している友人は、クライアントのHTTPリクエストがWebアプリケーションに到着した後SpringMVCフレームワークのDispatcherServletクラスによって配布され、Controllerレイヤーの特定のメソッドに配布されることを知っているはずです。

コントローラレイヤーのビジネスロジックに入る前、およびビジネスロジックを実行した後、リクエストは一連のインターセプターを通過します。この一連のインターセプターの処理フローは、責任連鎖モデルの実現でもあります。

- - -終わり - - -

この記事が好きな友達は、公式アカウントプログラマーのXiaohuiをフォローして、 もっとエキサイティングなコンテンツを見てください。

点个[在看],是对小灰最大的支持!

おすすめ

転載: blog.csdn.net/bjweimengshu/article/details/110016220