ホームページ >ウェブフロントエンド >jsチュートリアル >jsプロキシ設計パターンの詳細説明

jsプロキシ設計パターンの詳細説明

小云云
小云云オリジナル
2018-02-22 13:22:301513ブラウズ

プロキシ パターンは一般的なデザイン パターンの 1 つで、実際のオブジェクトが直接呼び出されるのではなく、プロキシ オブジェクトを通じて間接的に実際のオブジェクトが呼び出されることを意味します。

なぜオブジェクトを呼び出すためにこの間接的な形式を使用する必要があるのでしょうか?一般に、クライアントが実際のオブジェクトに直接アクセスしたくない、または実際のオブジェクトにアクセスするのが難しいため、訴訟の代理人として弁護士を雇うなど、代理オブジェクトを介して間接的にアクセスが完了します。

プロキシデザインパターンと装飾デザインパターンの違い

装飾モードはパッケージ化されたオブジェクトの機能を変更または拡張しますが、プロキシモードは一部の制御コードを追加することを除いて、そのアクセスを制御するだけであり、プロキシはオントロジーを変更しません。メソッドを変更するためにデコレーション モードが誕生しました

パッケージ化されたオブジェクトの作成方法、デコレーション モードはパッケージ化されたインスタンス化から完全に独立しており、仮想エージェントでは、このインスタンス化はプロキシ モードの一部です。は厳密に管理されており、内部で実行することは許可されていません。

エージェント

構造

jsプロキシ設計パターンの詳細説明

プロキシパターンのロール

  • インターフェースは共通のインターフェースを宣言します。ターゲット クラスとプロキシ クラス オブジェクトの統合により、ターゲット オブジェクトをどこでも使用できるようになります。プロキシ オブジェクトを使用できます。


  • オブジェクトクラス
  • は、プロキシオブジェクトによって表されるターゲットオブジェクトを定義します。


  • Proxy クラス
  • プロキシ オブジェクトは、ターゲット オブジェクトへの参照を内部に含むため、いつでもターゲット オブジェクトを操作できます。プロキシ オブジェクトとターゲット オブジェクトは統一されたインターフェイスを持ち、ターゲット オブジェクトをいつでも交換可能。プロキシ オブジェクトは通常、単に呼び出しをターゲット オブジェクトに渡すのではなく、クライアント呼び出しがターゲット オブジェクトに渡される前または後にいくつかの操作を実行します。


  • Interface
  • /* Library interface. */
    
    var Library = new Interface('Library', ['findBooks', 'checkoutBook', 'returnBook']);

  • Objectクラス
  • /* PublicLibrary class. */
    
    var PublicLibrary = function(books) { // implements Library
      this.catalog = {};
      for(var i = 0, len = books.length; i < len; i++) {
        this.catalog[books[i].getIsbn()] = { book: books[i], available: true };
      }
    };
    PublicLibrary.prototype = {
      findBooks: function(searchString) {
        var results = [];
        for(var isbn in this.catalog) {
          if(!this.catalog.hasOwnProperty(isbn)) continue;
          if(searchString.match(this.catalog[isbn].getTitle()) ||
              searchString.match(this.catalog[isbn].getAuthor())) {
            results.push(this.catalog[isbn]);
          }
        }
        return results;
      },
      checkoutBook: function(book) {
        var isbn = book.getIsbn();
        if(this.catalog[isbn]) {
          if(this.catalog[isbn].available) {
            this.catalog[isbn].available = false;
            return this.catalog[isbn];
          }
          else {
            throw new Error('PublicLibrary: book ' + book.getTitle() + 
              ' is not currently available.');
          }
        }
        else {
          throw new Error('PublicLibrary: book ' + book.getTitle() + ' not found.');
        }
      },
      returnBook: function(book) {
        var isbn = book.getIsbn();
        if(this.catalog[isbn]) {
          this.catalog[isbn].available = true;
        }
        else {
          throw new Error('PublicLibrary: book ' + book.getTitle() + ' not found.');
        }    
      }
    };

  • Proxyクラス
  • var PublicLibraryProxy = function(catalog) { // implements Library
      this.library = new PublicLibrary(catalog);
    };
    PublicLibraryProxy.prototype = {
      findBooks: function(searchString) {
        return this.library.findBooks(searchString);
      },
      checkoutBook: function(book) {
        return this.library.checkoutBook(book);
      },
      returnBook: function(book) {
        return this.library.returnBook(book);
      }
    };

  • PublicLibraryProxyとPublicLibraryは同じインターフェースを実装しており、オブジェクトメソッドを呼び出す際には後者のオブジェクトを組み合わせてインスタンスとして使用します。このメソッドは、装飾デザイン パターンに似ていますが、他のさまざまなプロキシの中で、最も有用ではありません。
Jabascript デザイン パターン

仮想エージェントは、作成にコストがかかるオントロジーへのアクセスを制御するために使用されます。これらは、メソッド (遅延読み込み) が呼び出されるまで、オントロジーのインスタンス化を延期します。 仮想プロキシ クラス

var PublicLibraryVirtualProxy = function(catalog) { // implements Library
  this.library = null;
  this.catalog = catalog; // Store the argument to the constructor.
};
PublicLibraryVirtualProxy.prototype = {
  _initializeLibrary: function() {
    if(this.library === null) {
      this.library = new PublicLibrary(this.catalog);
    }
  },
  findBooks: function(searchString) {
    this._initializeLibrary();
    return this.library.findBooks(searchString);
  },
  checkoutBook: function(book) {
    this._initializeLibrary();
    return this.library.checkoutBook(book);
  },
  returnBook: function(book) {
    this._initializeLibrary();
    return this.library.returnBook(book);
  }
};

関連推奨事項:
  • Java ベースのプロキシ設計パターン_MySQL

以上がjsプロキシ設計パターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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