責任連鎖パターンとは、リクエストには複数のオブジェクトの処理が必要であり、それによってリクエストの送信者と受信者の間の結合関係が回避されることを指します。これらのオブジェクトはチェーンに接続され、リクエストはオブジェクトが処理するまでチェーンに沿って渡されます。
実際の例から、特定のリクエストには複数の人の承認が必要な場合があり、たとえ技術マネージャーが承認したとしても、次のレベルの承認が必要であることがわかります。例えば、社内での休暇が3日未満の場合は直属のリーダーが承認することができ、7日を超える場合はプロジェクトマネージャーの承認が必要となります。テクニカルディレクターの承認。人生における責任の連鎖パターンの多くの例を紹介しましたが、オブジェクト指向における責任の連鎖パターンの定義を以下に示します。
責任連鎖モデルに含まれるオブジェクトにはハンドラーの役割しかありませんが、複数のハンドラーがあり、リクエストを処理する共通の方法があるため、ここではコードの再利用のために抽象ハンドラーの役割が抽象化されています。
リクエストクラス
// 采购请求 let PurchaseRequest = function (amount, productName) { this.amount = amount; this.productName = productName; };
プロセッサインターフェースクラス
// 审批人,Handler let Approver = function (name, nextApprover) { this.name = name; this.nextApprover = nextApprover; }; Approver.prototype.processRequest = function () { throw new Error(); };
プロセッサクラス
// ConcreteHandler let Manager = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(Manager, Approver); Manager.prototype.processRequest = function (request) { if (request.Amount < 10000.0) { console.log('ok'); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } }; // ConcreteHandler,副总 let VicePresident = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(VicePresident, Approver); VicePresident.prototype.processRequest = function (request) { if (request.Amount < 25000.0) { console.log('ok'); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } }; // ConcreteHandler,总经理 let President = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(President, Approver); President.prototype.processRequest = function (request) { if (request.Amount < 100000.0) { console.log('ok'); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } };
let requestTelphone = new PurchaseRequest(4000.0, "Telphone"); let requestSoftware = new PurchaseRequest(10000.0, "Visual Studio"); let requestComputers = new PurchaseRequest(40000.0, "Computers"); let manager = new Manager("LearningHard"); let Vp = new VicePresident("Tony"); let Pre = new President("BossTom"); // 设置责任链 manager.NextApprover = Vp; Vp.NextApprover = Pre; // 处理请求 manager.ProcessRequest(requestTelphone); manager.ProcessRequest(requestSoftware); manager.ProcessRequest(requestComputers);
使用シナリオ
システムの承認には複数のオブジェクトが必要です休暇制度等の処理が完了しました。
コード内に複数の if-else ステートメントがある場合は、責任連鎖パターンを使用してコードをリファクタリングすることを検討できます。
機能
は、リクエストの送信者と受信者間の結合を軽減します。
複数の条件判断をさまざまな処理クラスに分散して、コードをより明確にし、責任をより明確にします。
責任連鎖モデルには次のような欠点もあります。
正しい処理オブジェクトが見つかる前に、すべての条件判断を一度実行する必要がある 責任連鎖が長すぎると、パフォーマンスが低下する可能性があります。問題が発生すると、リクエストが処理されなくなる可能性があります。
概要
責任の連鎖により、リクエスターとレシーバーの間の結合が軽減され、複数のオブジェクトがリクエストを処理する機会が与えられます。責任の分割をより具体的にし、拡張に役立ちます
関連する推奨事項:
Java デザイン パターンにおける責任連鎖パターンの分析例
以上がjs責任連鎖モデルの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。