定義:
別のオブジェクトにサロゲートまたはプレースホルダーを提供して、そのオブジェクトへのアクセスを制御します。
別のオブジェクトにサロゲートまたはプレースホルダーを提供して、このオブジェクトへのアクセスを制御します。
概要:
通常、抽象テーマ、具体テーマ、エージェントテーマの 3 つの役割が含まれます。
抽象テーマ: 抽象クラスまたはインターフェイス、および一般的なビジネス タイプの定義です。
特定のテーマ: ビジネス ロジックの特定の実行者
エージェントの役割: 実際の役割の適用を担当し、抽象テーマ クラスによって定義されたすべてのメソッド制限を実装のために実際のテーマの役割に委任します。
一般的なクラス図:
一般的なコード:
package Proxy; //抽象主题类: public interface Subject { public void doSomething(); } package Proxy; //具体主题类 public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("业务逻辑..."); } } package Proxy; //代理主题类 public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } } package Proxy; //客户端 public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); } }
利点:
1. 責任の明確さ
2. 高い拡張性
エージェントモードの拡張:
通常のエージェント:
特定テーマクラスペアハイ-rise 透過的、プロキシ テーマ クラス内に特定のテーマ クラスを構築します
コード実装:
package GeneralProxy; public interface Subject { public void doSomething(); } package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在执行业务逻辑..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("无法创建被代理对象"); }else{ this.name = name; } } } package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); } } package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("张三"); proxy.doSomethaing(); } }
強制プロキシ:
特定のテーマ クラスにアクセスしてプロキシ テーマ クラスのオブジェクトを取得し、プロキシ テーマを使用する必要がありますアクセスを制御するクラス
コードの実装:
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy(); } package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在执行业务逻辑..."); }else{ System.out.println("请先访问代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } } } package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; } } package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("张三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); } }
アプリケーションシナリオ
現実の世界では、秘書はエージェントに相当し、上司が会議を行う場合、従業員に会議時間の通知などの会議関連のタスクを実行します。会議会場の手配や会議後の会場の片付けなどは幹事に任せることができ、上司は会議を開催するだけで済みます。同様に、プロキシ パターンをプログラミングで使用して、無関係なロジックと組み合わされた一連のコードを分離することもできます。たとえば、ビジネス コード内のログ コードをプロキシで実行できます。 Spring の AOP は、典型的な動的プロキシ アプリケーションです。
プロキシ モードのアプリケーション形式
(1) リモート プロキシ - オブジェクトが別のアドレス空間に存在するという事実を隠すことができます。また、クライアントがリモート マシン上のオブジェクトにアクセスできるようになり、リモート マシンのコンピューティング パフォーマンスと処理速度が向上し、クライアントの要求に迅速に応答して処理できるようになります。
(2)仮想プロキシ – 必要に応じて、大きなメモリオーバーヘッドを持つオブジェクトを作成できるようにします。このオブジェクトは本当に必要な場合にのみ作成してください。
(3) コピーオンライト プロキシ – クライアントが本当に必要とするまでオブジェクトのコピーを遅らせることにより、オブジェクトのコピーを制御するために使用されます。仮想エージェントの一種です。
(4) 保護 (アクセス) プロキシ) – さまざまなクライアントにターゲット オブジェクトへのさまざまなレベルのアクセスを提供します。
(5) キャッシュ プロキシ – 高価な操作結果の一時ストレージを提供します。これにより、複数のクライアントと結果を複数共有して、計算量やネットワーク量を削減できます。待ち時間。
(6) ファイアウォール プロキシ – ネットワーク リソースへのアクセスを制御し、悪意のあるクライアントからテーマを保護します。
(7)SynchronizationProxy – マルチスレッド状況でトピックへの安全なアクセスを提供します。
(8) Smart ReferenceProxy - オブジェクトが参照されると、このオブジェクトへの呼び出し数を記録するなど、いくつかの追加操作が提供されます。
(9) Complexity HidingProxy – クラスの複雑なコレクションの複雑さを隠し、アクセス制御を実行するために使用されます。ファサード プロキシと呼ばれることもありますが、理解するのは難しくありません。複雑な非表示プロキシは、プロキシがアクセスを制御するためファサード パターンとは異なりますが、ファサード パターンはプロキシがアクセスを制御するため異なり、ファサード パターンは別のインターフェイスのセットを提供するだけです。
Java デザイン パターン プログラミングでのプロキシ パターンの使用方法を説明するその他の例については、PHP 中国語 Web サイトの関連記事に注目してください。