コンセプト
プロキシモード:プロキシモードは、実際には元のオブジェクトでいくつかの操作を実行するための追加のプロキシクラスです。たとえば、弁護士が法律の専門知識を持ち、私たちのために私たちのアイデアを運営し、表現することができるため、訴訟に行くときに弁護士を雇う必要がある場合があります。これが代理店の意味です。プロキシモードは、2つのカテゴリに分割されます。1。静的プロキシ(JDKのメソッドを使用していません)。 2。動的プロキシ(JDKのInvocationHandlerとプロキシを使用)。
静的プロキシは、プログラマーまたはツールによって作成され、プロキシクラスのソースコードを生成し、プロキシクラスをコンパイルします。いわゆる静的は、プロキシクラスのバイトコードファイルがプログラムが実行される前にすでに存在することを意味し、プロキシクラスとデリゲートクラスの関係は実行前に決定されます。
動的プロキシクラスのソースコードは、プログラム操作中の反射およびその他のメカニズムに従ってJVMによって動的に生成されるため、プロキシクラスのバイトコードファイルはありません。プロキシクラスとデリゲートクラスの関係は、プログラムが実行されているときに決定されます。
例
ここでは、静的プロキシの例を示します。
クラス図:
/ *** Gamer Interface**/ public interface igameplayer {//ゲームパブリックボイドログイン(String user、string password)にログインします。 // Kill Monsters、オンラインゲームの主な機能public void Killboss(); // public void upgrade(); } / *** Gamer**/ public class GamePlayerはigameplayer {private string name = ""; //コンストラクターパブリックゲームプレイヤー(string _name){this.name = _name; } //モンスターと戦うとき、最も期待されるのは、古いモンスターの公共void killboss()を殺すことです。 } //ゲームに入る前にログインする必要があります。これは必要な状態です。 public void login(string user、string password){system.out.println( "login name is" + user + "rolis" + this.name + "login rogin justery!"); } //アップグレード、アップグレード、購入にお金を使うための多くの方法があり、タスクを実行することも、パブリックボイドアップグレード(){System.out.println(this.name + "Another Level!"); }} /***クライアントはプロキシオブジェクトに表示されません*/パブリッククラスのゲームプレイヤープロキシはigameplayer {private igameplayer gameplayer = null; // proxyオブジェクト//パブリックGameplayerproxy(string username){this.gameplayer = useplayer; } //モンスターを殺すための受信者public void killboss(){this.gameplayer.killboss(); } // public void login(string user、string password){this.gameplayer.login(user、password); } //アップグレードpublic void upgrade(){this.gameplayer.upgrade(); }} /**クライアントはプロキシオブジェクトに表示されません*/パブリッククラスのゲームプレイヤープロキシー2はigameplayer {private igameplayer gameplayer = null; } //受信者Kill Monsters public void killboss(){this.gameplayer.killboss(); } //受信者ログインpublic void login(string user、string password){system.out.println( "localestring()"); this.gameplayer.login(ユーザー、パスワード); } // upgrade()public void upgrade(){this.gameplayer.upgrade(); system.out.println( "アップグレード時間は:" + new date()。tolocalestring()); }} /**クライアントはプロキシオブジェクトに表示されません*/ public class GamePlayerProxy3 {private igameplayer GamePlayer; //コンストラクターパブリックゲームプレイヤープロキシ3(Igameplayer GamePlayer)を介してプロキシ(プロキシ)オブジェクトを渡す{this.gameplayer = gameplayer; System.out.println( "私はプロキシです。私が演じるキャラクターは他の人であり、動的に渡すことができます」); } public igameplayer getProxy(){return(igameplayer)proxy.newproxyInstance(this.getClass()。getClassLoader()、new class [] {igameplayer.class}、new MyInvocationHandler()); } private class myInvocationHandler InvocationHandler {@Override public Object invoke(Object Proxy、Method Method、Object args)Throws throws {if(method.getName()。equals( "login")){system.out.println( "localestring()"); } if(method.getname()。equals( "upgrade")){system.out.println( "アップグレード時間IS:" + new date()。tolocalestring()); } method.invoke(GamePlayer、args); nullを返します。 }}} public class test {public static void main(String [] args){ /**通常の静的プロキシ:クライアントはプロキシオブジェクトを知らず、プロキシオブジェクトはその関数呼び出し* / igameplayer proxy = new GamePlayerProxy( "x"); system.out.println( "開始時間IS:" + new date()。tolocalestring()); proxy.login( "zhangsan"、 "abcd"); proxy.killboss(); proxy.upgrade(); System.out.println( "終了時間IS:" + new Date()。tolocalestring()); System.out.println(); /**プロキシオブジェクトはプロキシオブジェクトの関数を強化します*/ igameplayer proxy2 = new GamePlayerProxy2( "M"); proxy2.login( "lisi"、 "efg"); proxy2.killboss(); proxy2.upgrade(); System.out.println(); /**ダイナミックプロキシ:JDKが提供するInvocationHandlerを使用してプロキシオブジェクトを呼び出す方法を反映します* java.Reflect.Proxyと組み合わせてプロキシオブジェクトを生成します*プロキシオブジェクトをダイナミックに入力してInvocationHandlerを構築します。 GamePlayerProxy3で実行される(通知) *は、メソッドがログインと呼ばれる場合の通知開始時間、およびアップグレード */ GamePlayerProxy3 dynamic = new GamePlayerProxy3(新しいGameProxy( "y"))の通知の終了時間です。 igameplayer dynamicplayer = dynamic.getProxy(); dynamicplayer.login( "wangwu"、 "1234"); dynamicplayer.killboss(); dynamicPlayer.upgrade(); /**編集指向:いくつかの同様のビジネスロジックを多くの場所に追加する必要があるため、トランザクションセクションであるセクションに抽出できます。ログセクション、許可セクション、ビジネスセクション*/}}印刷:
開始時間は次のとおりです。2014-10-8 17:19:05 Zhangsanを使用したログインロールXが正常にログインしました! Xはモンスターと戦っています! Xは別のレベルにアップグレードされました!終了時間は次のとおりです。2014-10-817:19:05ログイン時間は次のとおりです。2014-10-817:19:05ログインロールlisiが正常にログインしました! Mはモンスターと戦っています! Mは別のレベルにアップグレードされました!アップグレード時間は次のとおりです。2014-10-817:19:05私はプロキシプレーヤーです。私がプレイするキャラクターは他の誰かのものであり、私はそれを動的にログインすることができます。時間は次のとおりです:2014-10-8 17:19:05 Wangwuという名前のログイン文字Yは正常にログインしました! yはモンスターと戦っています!アップグレード時間は次のとおりです。2014-10-817:19:05 yは別のレベルにアップグレードされました!
アドバンテージ
(1)明確な責任の役割は、実際のビジネスロジックを実現することであり、他の反応のない問題を気にする必要はありません。後のエージェントを介してトランザクションを完了することができます。付随する結果は、簡潔で明確なプログラミングです。
(2)プロキシオブジェクトは、クライアントとターゲットオブジェクトの間の仲介者として機能し、役割を演じ、ターゲットオブジェクトを保護します。
(3)高いスケーラビリティ