静的および動的なJavaプロキシ・エージェント(学習例)

1.インタフェース

        パブリック インターフェイスチャンネル{
             無効送信(); 
        }

2.実装クラスは、(様々な異なる実装形態のものであってもよいです)

        パブリック クラス ChannelImplは実装チャンネル{ 
            @Override 
            公共 無効送信(){ 
                System.out.printlnは(「メッセージを送ります」)。
            } 
        }

3.静的エージェント:Agentクラス

        パブリック クラス ChannelProxyは実装チャンネル{
             // 代理对象
            チャンネルチャンネルを、
            // 传入代理对象
            公共ChannelProxy(チャンネルチャネル){
                 この .channel = チャネル; 
            } 
            @Override 
            公共 ボイド送信(){ 
                System.out.printlnは( "メッセージを送信開始" )。
                channel.send(); 
                System.out.println(「メッセージを送信終了」)。
            } 
        }

3.ダイナミックエージェント:Agentクラス

        / ** のInvocationHandlerのエージェント実装作成* / 
        パブリック クラス MyHandlerという用具のInvocationHandlerの{
             / ** 
             *ターゲットオブジェクト
             * / 
            オブジェクトターゲットを、

            公共MyHandlerという(オブジェクト・ターゲット){
                 この .TARGET = 目標; 
            } 
            @Override 
            パブリックオブジェクト呼び出しは(プロキシ、メソッド、オブジェクトこの方法は、オブジェクト[]引数)がスローされたThrowable { 
                するSystem.out.println( "送信メッセージ開始" ;)
                のSystem.out.println( + ":+ target.getClass( "コール対象物") 、ターゲットメソッド:" + 方法.getName())。
                オブジェクトの結果 = method.invoke(ターゲット)
                System.out.println(「メッセージを送信終了」)。
                戻り値の結果; 
            } 
        }

4.コール

        パブリック クラスProxyTest {
             公共 静的 ボイドメイン(文字列[]引数){ 
                するSystem.out.println(「=================静态代理========= ==========」); 
                チャンネルチャンネル = 新しいChannelImpl(); 
                ChannelProxy channelProxy = 新しいChannelProxy(チャンネル)
                channelProxy.send(); 

                System.out.println( "=================动态代理===================" ); 
                MyHandlerというはmyHandler = 新しいMyHandlerという(チャンネル)
                チャネルターゲット =(チャンネル)(たとえば、Proxy.newProxyInstance(channel.getClass()のgetClassLoader()、channel.getClass()でgetInterfaces()は、myHandler)。。); 
                target.send(); 
            } 
        }

5.結果

        =================静的プロキシは=================== 
        メッセージ送信開始
        メッセージが送信
        終了メッセージを送信し
         ==== =============ダイナミックプロキシは=================== 
        メッセージが送信開始
        クラスproxy.ChannelImpl、客観的な方法:送信対象オブジェクトを呼び出しを
        sendがメッセージ
        終了は、メッセージを送信します

比較:

静的プロキシ:
プロキシクラスを使用すると、プロキシクラスを呼び出すことができた場合にのみ、その特定の実装クラスとどのようにsendメソッドを実装する気にしませんが、デカップリングエージェントクラスと実装クラスは、インタフェースは、エージェントクラスと実装クラスを追加した場合、インターフェイスのすべてを実装する必要があります。あなたが他のプロキシインタフェースが必要な場合は、プロキシクラスのコードの冗長性とチェンジエージェント、追加する必要が1つのインタフェースだけ、あなたは新しいプロキシクラスを作成する必要があります
:動的プロキシ
なしの静的なエージェントの冗長性に加えて、静的プロキシ基礎を指定されたインターフェイスを実装する、任意の界面剤とすることができる、そのようなチャネルインターフェイスなどの他の方法がある場合create()メソッドは、MyHandlerというを呼び出す同様に処理されるので、界面法は比較的に長い時間である場合、我々は、インタフェースにメソッドを必要とします統一されたプロセス、動的なプロセスを使用して、より便利に、より多くの再利用性

おすすめ

転載: www.cnblogs.com/lantuanqing/p/11302811.html