意味:
別のオブジェクトの代理またはプレースホルダーを提供して、アクセスを制御します。
このオブジェクトへのアクセスを制御するための他のオブジェクトのプロキシ。
一般的な説明:
通常、抽象テーマ、具体的なテーマ、エージェントテーマの3つの役割が含まれています。
一般クラス図:
一般コード:
パッケージプロキシ; //要約トピッククラス:パブリックインターフェイス件名{public void dosomething();}パッケージプロキシ; //特定のトピッククラスのパブリッククラスRealSubject exmments {@override public void dosomething(){system.out.println( "Business Logic ..."); }}パッケージproxy; //プロキシトピッククラスプロキシ実装件名{private件名sub = null; @Override public void dosomething(){this.sub.dosomething(); } public Proxy(subject sub){this.sub = sub; }}パッケージproxy; //クライアントパブリッククラスクライアント{public static void main(string [] args){subject realsub = new realSubject();件名proxy = new Proxy(realSub); proxy.dosomething(); }}アドバンテージ:
1。明確な責任
2。高拡張
プロキシモードの拡張:
通常のエージェント:
特定のテーマクラスは高レベルのレベルから透明であり、特定のテーマクラスはプロキシテーマクラスで構築されています。
コード実装:
パッケージgeneralProxy; public Interface subject {public void dosomething();}パッケージgeneralProxy; public class realsubject explentice subject {private string name = null; @Override public void dosomething(){system.out.println(this.name + "proxy、execting business logic ..."); } public RealSubject(件名proxy、string name)shrows exception {if(proxy == null){throw new Exception( "proxyオブジェクトは作成できません"); } else {this.name = name; }}} package generalProxy;パブリッククラスのプロキシ実装件名{private件名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){//通常のプロキシ件名proxy = new Proxy( "Zhang San"); proxy.dosomethaing(); }}
強制プロキシ:
特定のトピッククラスにアクセスしてプロキシトピッククラスのオブジェクトを取得し、プロキシトピッククラスを使用してアクセスを制御する必要があります。
コード実装:
パッケージMustProxy;パブリックインターフェイス件名{public void dosomething();パブリックサブジェクトgetProxy();}パッケージMustProxy; public class realsubject explentice subject {private string name = null;プライベートサブジェクトプロキシ= null; @Override public void dosomething(){if(isproxy()){system.out.println(this.name + "proxy、business business logic ..."); } else {system.out.println( "最初にプロキシにアクセスしてください..."); }} public RealSubject(string name){this.name = name; } public Subject getProxy(){proxy = new Proxy(this); this.proxyを返します。 } private boolean isproxy(){if(this.proxy == null){return false; } else {return true; }}}パッケージMustProxy;パブリッククラスのプロキシ実装件名{private件名RealSub = null; public Proxy(subject realsub){this.realsub = realSub; } public void dosomething(){this.realsub.dosomething(); } public Subject getProxy(){これを返します。 }}パッケージMustProxy; public class client {public static void main(string [] args){subject realsub = new realSubject( "Zhang San"); realsub.dosomething();件名proxy = realsub.getProxy(); proxy.dosomething(); }}アプリケーションシナリオ
現実の世界では、秘書はエージェントと同等です。上司が会議を開催する場合は、会議時間を従業員に通知し、会場を手配し、会議の後に会場を整理するなど、会議に関連する作業を秘書に引き渡すことができます。上司は会議を開催するだけで、それらのことを直接行う必要はありません。同様に、プログラミングでは、プロキシパターンを使用して、ビジネスコードのログコードをプロキシで実行できるなど、一連の無関係なロジックと組み合わせるコードを分離することもできます。 SpringのAOPは、典型的な動的プロキシアプリケーションです。
プロキシモードのアプリケーションフォーム
(1)リモートプロキシ - 異なるアドレススペースにオブジェクトが存在するという事実を隠すことができます。また、クライアントはリモートマシン上のオブジェクトにアクセスできます。リモートマシンは、コンピューティングのパフォーマンスと処理速度が向上する可能性があり、クライアントリクエストを迅速に応答して処理できます。
(2)仮想プロキシを使用すると、必要に応じてメモリオーバーヘッドが高いオブジェクトを作成できます。本当にこのオブジェクトが必要な場合にのみ作成します。
(3)write-on-writeプロキシは、顧客が実際に必要となるまでオブジェクトのコピーを遅らせることにより、オブジェクトのコピーを制御するために使用されます。仮想プロキシのバリアントです。
(4)保護(アクセス)プロキシ)さまざまな顧客にさまざまなレベルのターゲットオブジェクトアクセス権を提供します
(5)キャッシュプロキシは、オーバーヘッド計算結果のために一時的なストレージを提供します。複数の顧客が結果を共有して、計算またはネットワークの遅延を減らすことができます。
(6)ファイアウォールプロキシは、ネットワークリソースへのアクセスを制御し、悪意のある顧客から被験者を保護します。
(7)SynchronizationProxyは、マルチスレッドの場合にトピックへの安全なアクセスを提供します。
(8)スマートリファレンスプロキシ - オブジェクトが参照されると、このオブジェクトへの呼び出しの数などの追加操作が提供されます。
(9)複雑さを隠すプロキシを使用して、クラスの複雑なコレクションの複雑さを隠し、アクセス制御を実行します。時にはファサードプロキシとも呼ばれますが、理解するのは難しくありません。プロキシはアクセスを制御するため、複雑な隠しプロキシと外観モードは異なりますが、プロキシモードはアクセスを制御するため、外観モードは異なりますが、外観モードは別のインターフェイスのセットのみを提供します。