責任連鎖モデル
概要
責任連鎖パターンは、オブジェクト指向のソフトウェア設計パターンであり、いくつかのコマンド オブジェクトと一連の処理オブジェクトが含まれます。複数のオブジェクトにリクエストを処理する機会を与えることで、リクエストの送信者と受信者の間の結合関係が回避され、リクエストは処理されるまでチェーンをたどります。
役割
抽象プロセッサの役割: リクエストを処理するためのインタフェースを定義します。必要に応じて、次のホームの参照を設定および返すメソッドをインタフェースに定義できます。この役割は通常、Java抽象クラスまたはJavaインタフェースによって実装されます。
特定のプロセッサの役割: リクエストを受信した後、特定のプロセッサはリクエストを処理するか、リクエストを次の当事者に渡すかを選択できます。コンクリート ハンドラーは次のホームへの参照を保持しているため、コンクリート ハンドラーは必要に応じて次のホームにアクセスできます。
アドバンテージ
リクエストと処理を分離することで、リクエスト プロセッサは処理する必要があるリクエストのみに集中し、不要なリクエストを次のレベルのプロセッサに直接転送するだけで済みます。
チェーン転送処理リクエスト機能により、リクエスト送信者はリンク内のインタフェースを知る必要がなく、処理結果を待つだけで済み、リンク構造が柔軟で、リンク変更により動的にタスクの追加・削除が可能構造。
新しいハンドラーを簡単に追加できます。
欠点がある
責任の連鎖が長すぎると、リクエスト処理の効率が低下し、プロセッサ オブジェクト内で循環参照が発生し、無限ループやメモリ オーバーフローが発生する可能性があります。
これはデバッグには役に立たず、ロジックはより複雑になります。
アプリケーションシナリオ
複数のオブジェクトが同じリクエストを処理するが、どのオブジェクトを処理するかを動的に決定する必要がある場合。
コード例
/**
* 测试
*/
public class ChainofResponsibilityDemo {
public static void main(String[] args) {
Handler handlerA = new HandlerA();
Handler handlerB = new HandlerB();
handlerA.setNext(handlerB);
handlerA.getReq("AB");
}
}
/**
* 处理器抽象类
*/
abstract class Handler{
Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void getReq(String req);
}
/**
* 处理者A
*/
class HandlerA extends Handler{
@Override
public void getReq(String req) {
if (req.contains("A")) {
System.out.println(this.getClass().getSimpleName()+":处理器A处理了该请求");
}
if (this.next!=null){
this.next.getReq(req);
}
}
}
/**
* 处理者B
*/
class HandlerB extends Handler{
@Override
public void getReq(String req) {
if (req.contains("B")) {
System.out.println(this.getClass().getSimpleName()+":处理器B处理了该请求");
}
if (this.next!=null){
this.next.getReq(req);
}
}
}
console:
HandlerA:处理器A处理了该请求
HandlerB:处理器B处理了该请求