責任連鎖モデル: 複数のオブジェクトは、対応するオブジェクトの参照によってチェーンに接続され、チェーン上の受信オブジェクトがリクエストを処理するまで、リクエストはこのチェーン上で渡されます。要求元のクライアントは、チェーン内の誰が最終的に要求を処理するのかを知らないため、システムはクライアントに影響を与えることなく動的に責任を再編成し、割り当てることができるため、要求の送信者と要求ハンドラーの間の結合を回避できます。
責任の連鎖には 3 つの役割が関係しています:
1、抽象的な処理者の役割
2、具体的な処理者の役割
3、リクエスト送信者
小さな例: 家を購入したいとします。家を買うには、交渉する必要があります。異なるポジションには異なる優先価格があり、異なるポジションがリクエストを処理するためのチェーンを形成する可能性があります。 * 草の根営業員は 3% 割引のみ * 営業マネージャー: 5% 割引 * 営業ディレクター: 8% 割引 * 上司 (ボス): 10% 割引
Java の例
クラス図:
/** * 抽象责任 */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleFilter(); public abstract void handleFilter2(); }
/** * 具体责任 */ public class ConcreteFilter extends IFilter { private String name; public ConcreteFilter(String name) { this.name = name; } @Override public void handleFilter() { /* * 自己先处理,如有后继者,再由它处理一次 */ System.out.println(name + " 处理了请求"); if (getSuccessor() != null) { getSuccessor().handleFilter(); } } @Override public void handleFilter2() { /* * 有后继者就后继者处理, 否则自己处理 */ if (getSuccessor() != null) { getSuccessor().handleFilter2(); } else { System.out.println(name + " 处理了请求"); } } }
public class Test { public static void main(String[] args) { IFilter filter1 = new ConcreteFilter("permission-filter");//权限过滤 IFilter filter2 = new ConcreteFilter("suffix-filter");//后缀名过滤 IFilter filter3 = new ConcreteFilter("style-filter");//风格过滤 filter1.setSuccessor(filter2); filter2.setSuccessor(filter3); System.out.println("------以下是每一个处理者(包括后继者)都处理了, 顺序也是一级一级的传递------"); filter1.handleFilter(); System.out.println("------以下是交由最后一个后继者处理------"); filter1.handleFilter2(); } }
印刷:
------以下是每一个处理者(包括后继者)都处理了, 顺序也是一级一级的传递------ permission-filter 处理了请求 suffix-filter 处理了请求 style-filter 处理了请求 ------以下是交由最后一个后继者处理------ style-filter 处理了请求
Java デザイン パターン プログラミングにおける責任連鎖パターンの使用例については、PHP 中国語 Web サイトの関連記事に注目してください。