- - - 次の日 - - -
————————————
会社には、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をフォローして、 もっとエキサイティングなコンテンツを見てください。
点个[在看],是对小灰最大的支持!