以前のブログでは、オブジェクト作成メカニズムを扱うさまざまな作成デザイン パターンを検討しました。ここで、構造設計パターンについて詳しく見ていきましょう。これは、オブジェクトとクラスを柔軟かつ効率的に保ちながら、より大きな構造を形成する方法に焦点を当てています。プロキシ設計パターンから始めましょう
プロキシ デザイン パターンは、別のオブジェクトを表すオブジェクトを提供する構造的なデザイン パターンです。これは、実際のオブジェクトへのアクセスを制御する仲介者として機能し、元のオブジェクトのコードを変更せずに、遅延初期化、ロギング、アクセス制御、キャッシュなどの追加の動作を追加します。
JavaScript では、プロキシは Proxy オブジェクトによって提供される組み込み機能であり、プロパティ アクセス、割り当て、関数呼び出しなどの基本的な操作のカスタム動作を定義できます。
プロキシ パターンは、次の場合に特に役立ちます。
ゲストに見せたい大きな絵画があると想像してください。しかし、それを倉庫から取り出すのに時間がかかります (重くて運ぶのに時間がかかるため)。毎回それを待つのではなく、実際の絵が取りに来るのを待っている間に、絵の小さなポストカード画像を使用してすぐに見せることにしました。
このたとえでは:
不動産業者を代理人と考えてください。家を購入したいと思ったとき、すぐにすべての家を訪問する(実物を積み込む)わけではありません。代わりに、不動産業者(代理人)が最初に写真と説明を見せます。購入する準備ができたとき (つまり、display() を呼び出したとき) にのみ、エージェントが自宅訪問を手配します (実際のオブジェクトをロードします)。
ユーザーが要求するまで画像の読み込みを遅らせる (遅延読み込み) 必要がある、Web アプリケーションでの画像読み込みの例を使用してみましょう。プロキシは、実際のイメージがロードされるまでプレースホルダーとして機能します。
ここでは、JavaScript でプロキシ設計パターンを実装する方法を説明します。
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
説明:
1)。実像:
2)。プロキシ画像:
3)。使用法:
ES6 プロキシは、ターゲットとハンドラーを引数として受け入れるプロキシ コンストラクターで構成されています
const proxy = new Proxy(target, handler)
ここで、ターゲットはプロキシが適用されるオブジェクトを表し、ハンドラーはプロキシの動作を定義する特別なオブジェクトです。
ハンドラー オブジェクトには、トラップ メソッド (apply、get、set、has など) と呼ばれる事前定義された名前を持つ一連のオプションのメソッドが含まれています。これらのメソッドは、対応する操作がプロキシ インスタンスで実行されるときに自動的に呼び出されます。
組み込みプロキシを使用して計算機を実装してこれを理解しましょう
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
この方法でプロキシを使用する最良の部分:
- プロキシ オブジェクトは、元の Calculator クラスのプロトタイプを継承します。
- 突然変異は、プロキシの設定されたトラップによって回避されます。
コードの説明
1)。 プロトタイプの継承:
2)。 getOperations の処理:
3)。 突然変異の防止:
設定されたトラップは、ターゲット オブジェクトのプロパティを変更しようとするたびにエラーをスローします。これにより不変性が保証されます。
4)。 プロキシを介したプロトタイプ メソッドの使用:
プロキシを使用すると、元のオブジェクトのプロトタイプで定義されている加算、減算、乗算、除算などのメソッドにアクセスできます。
ここで観察すべき重要なポイントは次のとおりです:
ここまで進んだ場合は、忘れずに「いいね!」を押して、質問や意見があれば下にコメントを残してください。あなたのフィードバックは私にとってとても大切なものです。ぜひご意見をお待ちしております!
以上がプロキシ設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。