ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターンのプロキシ パターンの詳細な分析_PHP チュートリアル

PHP デザイン パターンのプロキシ パターンの詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:07:10885ブラウズ

プロキシ パターン (プロキシ)。これは、オブジェクトの参照に使用される単純なハンドラ (またはポインタ) の拡張です。このポインタは、クライアント (Client) と実際のエグゼキュータの間に配置されるプロキシ (Proxy) オブジェクトに置き換えられます。 、ポインタには複数のターゲットが悪用できるフックがあります。

技術的に言えば、このパターンはクライアントと実際のサブジェクト (RealSubject) の間にプロキシ オブジェクトを挿入し、サブジェクト インターフェイスを維持し、そのメソッドをさまざまな方法で委任します。エージェントは、RealSubjects の遅延作成やデータのロード、他のマシンとのメッセージの交換、コピーオンライト ポリシーなど、すべてを透過的に行うことができます。これは HTTP プロキシに似ており、クライアント (ブラウザなど) とアプリケーションは HTTP サーバーとの接続に依存しており、プロキシは接続を管理しながら、アクセス制御や大きなダウンロード ファイルのキャッシュなどの他のタスクを実行できます。


プロキシモードのオブジェクトグラフは、デコレーションモードのオブジェクトグラフと構造が似ていますが、デコレータがオブジェクトに動的に動作を追加するのに対し、プロキシはクライアントからのアクセスを制御します。さらに、エージェントは必要な場合にのみ RealSubject を作成します。

参加者:
◆クライアント: サブジェクトの実装に依存します。
◆サブジェクト: RealSubject の抽象化。
◆RealSubject: 高価な作業を完了するか、大量のデータが含まれます。
◆プロキシ: クライアントにSubject への一貫した参照を維持し、必要な場合にのみ RealSubject インスタンスを作成または通信します。

以下は、広く使用されている 2 つのプロキシ パターンの例です:
1. オブジェクト リレーショナル マッピング (Orms) は、実行時にエンティティ クラスのサブクラスとしてプロキシを作成し、遅延読み込み (仮想プロキシ) を実装します。すべてのエンティティ メソッドをカバーし、前にローダーを追加します。Orms エージェントは、現在ロードされているオブジェクト グラフの境界に配置されるため、データベース全体をロードせずにオブジェクト間の双方向の関係をサポートします。

2. Java RMI はリモート プロキシ オブジェクト (リモート プロキシ) を使用します。そのメソッドが呼び出されると、プロキシはパラメータをシリアル化し、ネットワーク上でリクエストを実行し、その呼び出しを別のノード上の実際のオブジェクトに委任します。リモート オブジェクトの場合、それらが同じマシン上にあるかどうかを心配する必要はありませんが、この透過性により実行が遅くなる可能性があります。

次のコード例では、ImageProxy を実装して画像データの読み込みを遅延します。

コードをコピーします コードは次のとおりです:

/** 
* 件名インターフェイス。 
* クライアントはこの抽象化のみに依存します。 
 */
インターフェース画像
{
public function getWidth(); 

パブリック関数 getHeight(); 

パブリック関数 getPath(); 

/** 
* @return string 画像のバイトストリーム
    */
パブリック関数 dump(); 
}

/** 
* プロキシ
* と件名での定型コードの繰り返しを避けるための抽象クラス。ここでは、RealSubject を
* インスタンス化せずに提供できるメソッドのみを示します。 
 */
抽象クラス AbstractImage は Image を実装します
{
protected $_width; 
$_height を保護しました。 
保護された $_path; 
$_data を保護しました。 

public function getWidth()
{
return $this->_width; 
}

public function getHeight()
{
return $this->_height; 
}

public function getPath()
{
return $this->_path; 
}
}

/** 
* 本当の主体。データのダンプ
* が必要でない場合でも、常にイメージを読み込みます。 
 */
class RawImage extends AbstractImage
{
public function __construct($path)
{
$this->_path = $path; 
list ($this->_width, $this->_height) = getimagesize($path); 
$this->_data = file_get_contents($path); 
}

public function dump()
{
return $this->_data; 
}
}

/** 
* プロキシ。本当に必須になるまで、画像データのロードを延期します。 
* このクラスは、BLOB の実際のロードなど、非常にコストのかかる操作
* を延期するために最善を尽くします。 
 */
class ImageProxy extends AbstractImage
{
public function __construct($path)
{
$this->_path = $path; 
list ($this->_width, $this->_height) = getimagesize($path); 
}

} / **&#&* /
プロテクション関数_lazyload()
{
if($ this-> _realimage === null){
$ this-> _realimage = new rawimage($ this-&gt ;_パス); 
}
}

パブリック関数 dump()
{
$this->_lazyLoad(); 
return $this->_realImage->dump(); 
}
}

/** 
* RawImage を作成し、その機能を利用します。 
    */
class Client
{
public function tag(Image $img)
{
return '; 
}
}

$path = '/home/giorgio/shared/Immagini/kiki.png'; 
$client = 新しいクライアント(); 

$image = 新しい RawImage($path); // BLOB の読み込みが行われます
echo $client->tag($image), "n"; 

$proxy = 新しい ImageProxy($path); 
echo $client->tag($proxy), "n"; // ここでもロードは行われません


上記のコードは、PHP のプロキシ モードを実装しています。簡単に言えば、プロキシ パターンは、このオブジェクトへのアクセスを制御するために他のオブジェクトにプロキシを提供することです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327556.html技術記事プロキシ パターン (Proxy)。これは、オブジェクトを参照するために使用される単純なハンドラ (またはポインタ) の拡張です。このポインタはプロキシ (Proxy) オブジェクトに置き換えられ、プロキシ オブジェクトはクライアント (...) に配置されます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。