ソフトウェア開発業界にはポイントがあります。タスクの問題は解決するために、中間層を追加することができます。プロキシモードでも、このアイデアの製品です。
:まず、プロキシモードの定義を見て、他のオブジェクトへのオブジェクトへのアクセスを制御するためのプロキシを提供します。それは、このような権限の制御として、そのクラスの元へのアクセスを制御するために、このクラスを使用して、別のクラスにクラスを委譲することです。クラス図を見てください。
静的および動的プロキシエージェントに分かれて演技。次は、静的なエージェントを見てください。
帯電防止剤
1 // インタフェース 2 パブリック インターフェースヒト{ 3。 公共 ボイド(EAT) 。4 5。 公共 ボイド ブレス(); 6 } 。7 。8 // 元のオブジェクト 。9 パブリック クラスベビー実装ヒト{ 10 公共 ボイドは(EAT){ 11。 システム。 out.printlnを( "に吸引" ); 12である } 13である 14 公共 ボイド 呼吸(){ 15 のSystem.out.println( "無限呼吸!" )。 16 } 17 } 18である 。19 @ プロキシクラス 20はある 公共の クラスママ実装ヒト{ 21は プライベート;ヒト人間 22が パブリックママ(){ 23であり 、このヒト=。新しい新しい赤ちゃん(); 24 } 25 26である 公共 ボイド(EAT){ 27 システム.out.println( "看護師に赤ちゃんを供給!" ); 28 human.eat(); 29 } 30 31である 公共 ボイド(ブレス){ 32 human.breath(); 33である } 34である } 35 36 パブリック クラスクライアント{ 37 [ パブリック 静的 ボイドメイン(文字列[]引数){ 38は、 ヒトHM = 新しい新;ママ() 39 hm.eat(); 40 hm.breath() ; 41 } 42 } 43である 44れます ------------------------------------------- ------------------------------ 45 ちょっと赤ちゃんの看護師! 46 給ないように 47を決してしては呼吸を停止します!
動的プロキシ
例は、ヒューマンインタフェースとベビークラス上記動的プロキシの例の使用です。
// 动态代理 パブリック クラス ProxyMomは実装のInvocationHandler { プライベートヒト人間= ヌル。 公共ヒトgetProxyInterface(ヒトhuman1){ この .human = human1。 ヒトHM =(ヒト)たとえば、Proxy.newProxyInstance(human.getClass()のgetClassLoader()、human.getClass()でgetInterfaces()、。。本) リターンHM。 } @Override パブリックオブジェクトを呼び出し(オブジェクトのプロキシは、メソッドのメソッドは、[]引数オブジェクト)が スローされたThrowable { // TODO自動生成方法スタブを オブジェクトmethodObj = nullを。 System.out.println( "喂婴儿吃奶!" ); methodObj = method.invoke(ヒト、引数)。 返すmethodObjを。 } } パブリック クラスクライアント{ 公共 静的 ボイドメイン(文字列[]引数){ ProxyMomのPM = 新しいProxyMom()。 人間の赤ちゃん = pm.getProxyInterface(新しいベビー()); baby.eat(); baby.breath(); } } -------------------------------------------------- ----------------------- ちょっと赤ちゃんの看護師! 幼児で 幼児送りを与え! 呼吸が停止したことはありません!
1、のInvocationHandler内のJavaの動的プロキシはインターフェイスを実装する必要があります。
次いで2、およびinvokeメソッドを書き換えます。最初のパラメータは次のとおりです。プロキシクラスオブジェクト。第二は:プロキシ方法に対する必要性、および第三のメソッドパラメータです。さらに、自動的に調整されるように呼び出します。ユーザーが画面を呼び出す必要はありません。
一例として、我々はそれを見て、それが静的な薬剤である場合は、エージェントクラスとネイティブクラスは一から一です。どのように多くのネイティブクラスメソッド、エージェントクラスにも薬に適切な基本的な考え方を持っている必要がありますので、常に変化するために生まれてきオリジナルのプロキシクラスに従ってください。ネイティブクラスは、プロキシクラスはまた、非常に柔軟性のない方法で、数を必要とする多くの方法を持っている場合。プロキシ、InvocationHandlerですと、この問題の結果のメソッドを呼び出すことによって動的プロキシ。統一されたプロセスは、その上にメソッドを呼び出すことができますので。便利で柔軟な。
プロキシクラスにしたい場合は、Javaの動的プロキシは、プロキシインタフェース、および、ライブラリを使用する必要がCGLIBことができます。
エージェントの典型的なユースケース
1、リモートエージェント。2.アラート。3、コピー・オン・ライトのエージェント。4、保護(プロテクトまたはアクセス)エージェント。5、キャッシュプロキシ。6、ファイアウォール(ファイアウォール)エージェント。図7に示すように、同期(同期)エージェント。8、スマートリフェラル(スマート参考)エージェント。
また、エージェントモデルの性質によって見られている典型的な使い方は、クラスへのアクセスを制御することです
差分プロキシモードと装飾的なパターン
もちろん、彼らはの実現に非常に似ています。しかし、代理店モデルは、コントロールの種類へのアクセスを強調しますが、主に動的な機能強化のクラスに装飾模様のためにします。