ホームページ >Java >&#&チュートリアル >Java のプロキシ モードを理解する方法
場合によっては、何かまたは誰かと直接対面したくない場合があるため、仲介者を見つけて、何かを行うことができます。贈り物を送る、用事の電話をかける、特定の都市に行くための清掃員を探すなど。このように、相手方は仲介者の背後に誰が関与しているのか分からず、仲介者の役割を果たして対象物を守る、これが代理店モデルです。つまり、仲介者があなたの代わりにそれを行います。
何らかの理由により、オブジェクトへのアクセスを制御するためにオブジェクトにプロキシを提供する必要があります。このとき、アクセス オブジェクトは適切ではないか、ターゲット オブジェクトを直接参照できません。プロキシ オブジェクトはアクセス オブジェクトとターゲット オブジェクトの間の仲介として機能します。
単純な構造図:
利点:
1. 仲介の役割を果たします。クライアントと対象オブジェクトとの間の役割 対象オブジェクトを保護する役割
2. 対象オブジェクトの機能を拡張できる
3. クライアントと対象オブジェクトを分離することができ、これにより、システムの結合がある程度減少し、プログラムの複雑さが増加します。 (中間クラス (エージェント) が 1 つ以上あるため)
2. クライアントとターゲット オブジェクトの間にプロキシ オブジェクトを追加すると、リクエストの処理速度が遅くなります#3。システムの複雑さの増加
3. プロキシ パターンの分類 プロキシ パターンは、静的プロキシ (この記事)
と動的プロキシ (次の記事) に分かれています。記事)
:静的: プロキシ クラスを作成するか、特定のツールがソース コードを自動的に生成してコンパイルします。プロキシ クラスのプロキシ クラスはプログラムの実行前にすでに存在しています
動的: プログラムの実行時にリフレクション メカニズムを使用して動的に作成されます
1. 抽象テーマ クラス:
インターフェイスまたは抽象クラスを介して実際のテーマとプロキシ オブジェクトによって実装されるビジネス メソッドを宣言します3. プロキシ クラス:
実際のトピックと同じインターフェイスを提供し、実際のテーマの機能にアクセス、制御、または拡張できる実際のトピック Reference への内部参照を含みますコードのデモ:
抽象テーマの定義:
静的プロキシを使用する場合は、インターフェイスまたは親クラスを定義する必要があります。プロキシ オブジェクトとプロキシ オブジェクトは同じインターフェイスを実装するか、同じ親クラスを継承します
/** *抽象主题 */ public interface Subject { void Request(); }#実際のトピック:
/**
*真实主题类:实现抽象主题
*/
public class RealSubject implements Subject{
@Override
public void Request() {
System.out.println("您的航班正在飞行");
}
}
#エージェント クラス:
//代理类,实现抽象类的接口 public class Proxy implements Subject{ private RealSubject realSubject; @Override public void Request() { //先判断是否存在真实主题RealSubject //如果没有,就新建一个 if(realSubject == null){ realSubject = new RealSubject(); } //预处理,使用这个方法 preRequest(); //去访问真实主题类的方法 realSubject.Request(); //代理类的后续方法 postRequest(); } private void preRequest() { System.out.println("航班马上起飞啦"); } private void postRequest() { System.out.println("航班到达目的地,感谢乘坐"); } }
テスト クラス:
public class Test { public static void main(String[] args) { //使用代理去访问RealSubject里面的Request Proxy proxy = new Proxy(); proxy.Request(); } }
出力結果:
フライトは離陸しようとしていますあなたの飛行中です飛行機は目的地に到着しました。ご乗車いただきありがとうございます
上記のデモを通じて、プロキシ クラスを使用して実際のテーマ クラスのメソッドにアクセスします。テスト クラスは、誰がアクセスしているのか、プロキシ クラスなのか、プロキシ クラスの背後に他の人がいるのかを認識しないため、オブジェクトは適切に保護されます。これも代理店モデルの利点です。
静的プロキシの概要:5. プロキシ モードのアプリケーション シナリオオブジェクトを直接参照できない、または参照したくない場合、またはオブジェクトへのアクセスが困難な場合、プロキシ オブジェクトを通じて間接的にアクセスできます。プロキシ モードを使用する主な目的は 2 つあります。
ターゲット オブジェクトの関数を変更せずにターゲット関数を拡張できますが、プロキシ オブジェクトはターゲットと同じである必要があります。オブジェクト.インターフェースなのでプロキシクラスが多くなります.プロキシクラスが多いとメンテナンスが大変になります.ではこの問題をどう解決するのでしょうか?次に、動的プロキシを使用する必要があります。
1 つはターゲット オブジェクトを保護すること、もう 1 つはターゲット オブジェクトを強化することです
このアプリケーション シナリオの概要は次のとおりです。インターネットからの参照:
##リモート プロキシ。このメソッドは通常、ターゲット オブジェクトが別のアドレス空間に存在するという事実を隠し、クライアント アクセスを容易にするために使用されます。たとえば、ユーザーがネットワーク ディスク領域を申請すると、ユーザーのファイル システム内に仮想ハードディスクが作成され、ユーザーがその仮想ハードディスクにアクセスすると、実際にネットワーク ディスク領域にアクセスすることになります。
Virtual Agent 、この方法は通常、作成するターゲット オブジェクトが高価な場合に使用されます。例えば、大きな画像のダウンロードには時間がかかり、一部の計算は複雑で短時間では完了できない場合、最初に現実のオブジェクトを小規模な仮想エージェントに置き換えることで、ユーザーの不安感を解消できます。サーバーが遅いです
インテリジェント ガイダンスは主に、ターゲット オブジェクトを呼び出すときにエージェントにいくつかの追加の処理機能を追加するために使用されます。たとえば、実オブジェクトへの参照数を計算する機能を追加し、オブジェクトが参照されなくなった場合に自動的に解放できるようにします。
遅延読み込みとは、読み込みを遅らせることを指します。システムのパフォーマンスを向上させるための実際のオブジェクトのターゲットのロード。たとえば、Hibernate にはプロパティの遅延ロードと関連テーブルの遅延ロードがあります
以上がJava のプロキシ モードを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。