コンセプト
プロキシパターン: オブジェクトの構造パターン。オブジェクトにプロキシを提供すると、プロキシ オブジェクトは元のオブジェクトへの参照を制御します。
UML
Role
抽象サブジェクトロール (サブジェクト): RealSubject が使用される場所であればどこでもプロキシを使用できるように、RealSubject と Proxy のパブリック インターフェイスを定義します。
実際のサブジェクトの役割 (RealSubject): プロキシによって表される実際のエンティティを定義します。
プロキシ オブジェクト (Proxy): プロキシがエンティティにアクセスできるように参照を保存し、エンティティ (RealSubject) の代わりにプロキシを使用できるように、RealSubject インターフェイスと同じインターフェイスを提供します。
適用可能なシナリオ
プロキシ モードを使用する目的に応じて、一般的なプロキシ モードには次のタイプがあります。
リモート プロキシ: 異なるアドレス空間にあるオブジェクトにローカル プロキシ オブジェクトを提供します。リモート エージェントは、同じホストまたは別のホストに存在します。アンバサダーとも呼ばれます。
仮想プロキシ: 大量のリソースを消費するオブジェクトを作成する必要がある場合は、まずそれを表す比較的少量のリソースを消費するオブジェクトを作成します。実際のオブジェクトは必要な場合にのみ作成されます。
コピーオンライトエージェント: これは、クライアントが本当に必要とする場合にのみ実行されるまで、コピー (クローン) 操作を遅らせる仮想エージェントの一種です。一般に、オブジェクトのディープ クローン作成はコストのかかる操作であり、コピーオンライト プロキシによってこの操作が遅延する可能性があり、オブジェクトは使用される場合にのみクローン作成されます。
保護またはアクセス エージェント: オブジェクトへのアクセスを制御し、さまざまなユーザーにさまざまなレベルの使用許可を提供できます。
キャッシュ エージェント: 特定のターゲット操作の結果に一時的なストレージ スペースを提供し、複数のクライアントがこれらの結果を共有できるようにします。
ファイアウォール (ファイアウォール) プロキシ: 悪意のあるユーザーからターゲットを保護します。
同期プロキシ: 複数のユーザーが競合することなく同時にオブジェクトを使用できるようにします。
スマート参照エージェント: オブジェクトが参照されると、このオブジェクトが呼び出された回数を記録するなど、いくつかの追加操作が提供されます。
コード
コードは次のとおりです:
<?php header("Content-type:text/html;Charset=utf-8"); /** * Interface Subject 抽象主题角色 * * 定义RealSubject和Proxy共同具备的东西 */ interface Subject { public function say(); public function run(); } /** * Class RealSubject 真正主题角色 */ class RealSubject implements Subject { // 姓名 private $_name; /** * RealSubject constructor. 构造方法 * * @param $name */ public function __construct($name) { $this->_name = $name; } /** * 说话 */ public function say() { echo $this->_name."在说话<br>"; } /** * 在跑步 */ public function run(){ echo $this->_name."在跑步<br>"; } } /** * Class Proxy 代理对象 */ class Proxy implements Subject { // 真实主题对象 private $_realSubject = null; /** * Proxy constructor. 构造方法,依赖注入方式储存真实对象 * * @param RealSubject|null $realSubject */ public function __construct(RealSubject $realSubject = null) { if (empty($realSubject)) { $this->_realSubject = new RealSubject(); } else { $this->_realSubject = $realSubject; } } /** * 调用说话方法 */ public function say() { $this->_realSubject->say(); } /** * 调用跑步方法 */ public function run() { $this->_realSubject->run(); } } /** * Class Client 本地测试 */ class Client { public static function test() { // 创建 $subject = new RealSubject("张三"); // 代理 $proxy = new Proxy($subject); // 张三在说话 $proxy->say(); // 张三在跑步 $proxy->run(); } } // 测试 Client::test();
動作結果:
Zhang Sanが話しています
Zhang Sanが実行しています
長所と短所
長所:
プロキシモードは発信者と受信者を調整できます、ある時点でシステムの結合度をある程度下げます。
リモート プロキシを使用すると、クライアントはリモート マシン上のオブジェクトにアクセスできるようになり、リモート マシンのコンピューティング パフォーマンスと処理速度が向上し、クライアントのリクエストに迅速に応答して処理できるようになります。
仮想エージェントは、小さなオブジェクトを使用して大きなオブジェクトを表すことにより、システム リソースの消費を削減し、システムを最適化し、実行速度を向上させることができます。
保護エージェントは、実際のオブジェクトへのアクセスを制御します。
短所:
クライアントと実際のトピックの間にプロキシ オブジェクトが追加されるため、一部の種類のプロキシ モードではリクエストの処理が遅くなる可能性があります。
プロキシ パターンの実装には追加の作業が必要で、一部のプロキシ パターンの実装は非常に複雑です。