js責任連鎖モデルの詳細説明

小云云
小云云オリジナル
2018-02-28 14:22:421652ブラウズ

責任連鎖パターンとは、リクエストには複数のオブジェクトの処理が必要であり、それによってリクエストの送信者と受信者の間の結合関係が回避されることを指します。これらのオブジェクトはチェーンに接続され、リクエストはオブジェクトが処理するまでチェーンに沿って渡されます。

実際の例から、特定のリクエストには複数の人の承認が必要な場合があり、たとえ技術マネージャーが承認したとしても、次のレベルの承認が必要であることがわかります。例えば、社内での休暇が3日未満の場合は直属のリーダーが承認することができ、7日を超える場合はプロジェクトマネージャーの承認が必要となります。テクニカルディレクターの承認。人生における責任の連鎖パターンの多くの例を紹介しましたが、オブジェクト指向における責任の連鎖パターンの定義を以下に示します。

責任連鎖モデルに含まれるオブジェクトにはハンドラーの役割しかありませんが、複数のハンドラーがあり、リクエストを処理する共通の方法があるため、ここではコードの再利用のために抽象ハンドラーの役割が抽象化されています。

js責任連鎖モデルの詳細説明

実装

  • リクエストクラス

    // 采购请求
    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 ステートメントがある場合は、責任連鎖パターンを使用してコードをリファクタリングすることを検討できます。

機能

  • は、リクエストの送信者と受信者間の結合を軽減します。

  • 複数の条件判断をさまざまな処理クラスに分散して、コードをより明確にし、責任をより明確にします。

責任連鎖モデルには次のような欠点もあります。

  • 正しい処理オブジェクトが見つかる前に、すべての条件判断を一度実行する必要がある 責任連鎖が長すぎると、パフォーマンスが低下する可能性があります。問題が発生すると、リクエストが処理されなくなる可能性があります。

概要

  • 責任の連鎖により、リクエスターとレシーバーの間の結合が軽減され、複数のオブジェクトがリクエストを処理する機会が与えられます。責任の分割をより具体的にし、拡張に役立ちます

関連する推奨事項:

JavaScript 責任連鎖パターンの概要

Java デザイン パターンにおける責任連鎖パターンの分析例

共通設計の責任パターンチェーンパターンとそのphp実装

以上がjs責任連鎖モデルの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。