ケーススタディ:デザインパターンとコードの構造的特徴 - プロキシモード(プロキシ)

プロキシモードについて

定義1、プロキシモード

プロキシモードでは、このオブジェクトへのアクセスを制御する他のオブジェクトのプロキシを提供する構造モデルの一部です。これは、前に前処理のこのメソッドを呼び出して、クラス(オブジェクト)の詳細な制御缶アクセス方式です。後処理を行うには、このメソッドを呼び出した後。

カテゴリー2、プロキシモード

作用モードは、2つのカテゴリ、すなわち、静的および動的プロキシエージェントに分割することができます。このうち、静的なエージェントが静的に定義されたプロキシクラスが必要です、私たちは自分自身を定義する必要があります。ダイナミックプロキシを動的にプログラムを介してプロキシクラスを生成し、プロキシクラスは、それがプログラムによって自動的に生成され、私たち自身の定義ではありません。静的プロキシのみプロキシ単一のターゲットオブジェクト、及び無高ダイナミックプロキシー効率ができるが動的プロキシは、複数のターゲット視聴者を表すことができます。

3効果、プロキシモード

いくつかのケースでは、不適切またはオブジェクトではありませんが、別のオブジェクトへの直接参照され、プロキシオブジェクトは、クライアントとターゲットオーディエンスの間の仲介の役割を果たすことができます。簡単に言えば、プロキシモードでは、より多くのアウトプロキシクラスのある本来の目的のために何かをします。例えば、レンタル代理店、およびその仲介エージェントの星があります。住宅機関のための必要性、マスターへのあなたの家の情報領域は、包括的な十分ではありませんので、ので、これらの事を行うには、不動産エージェント、どのような手段薬に慣れ見つけます。次のグラフは、簡単な図です。

 

 

4つの長所と短所、プロキシモード

これは、プロキシモードの長所と短所が明らかにされている使用しています。利点は明らかである責任、高い拡張性、機能性がより明確に分けることができる場所、後のメンテナンスに役立ちます。欠点は、要求の対象の速度が遅くなるということです。

第二に、プロキシモードのコードの実装

1、静的プロキシモード

静的プロキシモードでは、一般的に3つの役割を持っています:

要約役割:エージェントの役割(ブローカー)を指し、両方を提供するために、一般的な方法本当の役割(スター)、通常のインターフェース

本当の役割:エージェントロールコールために達成すべきビジネスロジックの真の役割を定義する抽象インタフェースの役割を達成するために必要。つまり、この中で実際のビジネスロジックです。

役割演技:抽象を実装するためのインタフェースの必要性の役割を、代理店の本当の役割は、ビジネス・ロジック・メソッドの本当の役割で抽象メソッドを実装することで、自分の業務を添付することができます。

 プロキシモードでは、我々は、プロセス制御剤は、治療の役割に入れて統一されます。以下に、帯電防止剤のパターン構成図です。

私たちは、スターのエージェントをシミュレートすることにより、静的なエージェントモードの役割を説明するためにここにいます。私たちは、抽象文字インタフェース(スター)、達成するために働く役割(ProxyStar)、(RealStar)を達成するための本当の役割を定義します。

要約役割インターフェース:星と協力して一連の処理を提供します

パッケージに違約金   proxy.staticProxy; 

/ * 抽象的役割:パブリックメソッド演技の役割との両方の本当の役割を提供* / パブリック インターフェイススター{ 無効与えるで(); // インタビュー 無効 signContract(); // 契約 無効 bookTicket(); // 予約の 無効()playShowを; //が表示され 、ボイド collectMoneyを(); //は、最終的な支払いを受け取ります }

 

 エージェントの役割の実装クラス:エージェントの操作で役割を演技(パフォーマンス)に必要な本当の役割

以下のためのパッケージ変更 proxy.staticProxy; 

/ * 演技役割(スターブローカー):* / パブリック クラス ProxyStar 実装スター{ プライベートスタースター; // 参照(スター)実際のオブジェクト / * @Override * / 公共 のボイド与えるで(){ System.out.println( "ProxyStar.confer()" ); } / * @Override * / パブリック 無効signContract(){ System.out.println( "ProxyStar.signContract()" ); } / * @Override * / パブリック 無効bookTicket(){ System.out.println( "ProxyStar.bookTicket()" ); } / * @Override * / パブリック 無効playShow(){ star.playShow(); // 実際のオブジェクト操作(スターパフォーマー) } / * @Override * / パブリック 無効collectMoney(){ System.out.println( "ProxyStar.collectMoney()" ); } 公共 ProxyStar(スタースター){ // するためにコンストラクタによって本当の役割の割り当て この .star = スター。 } }

 

本当の役割実装クラス:ここでは本当の役割、実際には、1つの操作のみを歌い、これは実際のビジネス・ロジック真の役割があります

 

パッケージproxy.staticProxyを。
 
/ * 実質的な役割(スターパフォーマー):* / パブリック クラス REALSTAR 実装スター{
     / * @Override * / 
    公共 のボイド与えるで(){
        System.out.println( "RealStar.confer()" );
    }
    / * @Override * / 
    パブリック 無効signContract(){
        System.out.println( "RealStar.signContract()" );
    }
    / * @Override * / 
    パブリック 無効bookTicket(){
        System.out.println( "RealStar.bookTicket()" );
    }
    / * @Override * / 
    パブリック 無効playShow(){
        System.out.println( "ジェイ.playShow()"); // 操作の真の役割:実際のビジネス・ロジック
    }
     / * @Override * / 
    パブリック 無効collectMoney(){
        System.out.println( "RealStar.collectMoney()" );
    } 
}

 

プロキシクラスをテストします:

パブリック 静的 ボイドメイン(文字列[]引数){
    スターリアル = 新しいRealStar();
    スタープロキシ = 新しいProxyStar(本当の);
    proxy.confer();
    proxy.signContract();
    proxy.bookTicket();
    proxy.palyShow(); // 動作し、実際のオブジェクト(スター公演)
    proxy.collectMoney();
}

 

 

出力は次のようになります。

        ProxyStar.confer()

        ProxyStar.signContract()

        ProxyStar.bookTicket()

        ジェイ.playShow()      //これは、ビジネスロジック処理の本当の役割であります

        ProxyStar.collectMoney()

2、動的プロキシ・モード

ダイナミックプロキシエージェントは、ビジネス・ロジック・プロセッサにより、プロセスへのエージェントの役割を役割を定義する必要があります。

要約役割インターフェース:星と協力して一連の処理を提供します

パッケージ  proxy.staticProxyを。

/ * 要約役割:パブリックメソッド演技の役割との両方の本当の役割を提供* /
 
パブリック インターフェイススター{
     無効与えるで(); // インタビュー
    無効 signContract(); // 契約
    無効 bookTicket(); // 予約の
    無効()playShowを; //が表示され
    、ボイド collectMoneyを(); //は、最終的な支払いを受け取ります 
}

本当の役割実装クラス:ここでは本当の役割、実際には、1つの操作のみを歌い、これは実際のビジネス・ロジック真の役割があります

パッケージproxy.staticProxyを。
 
/ * 実質的な役割(スターパフォーマー):* /

パブリック クラス RealStar 実装スター{
     / * @Override * / 
    パブリック 無効与えます(){
        System.out.println( "RealStar.confer()" );
    }
    / * @Override * / 
    パブリック 無効signContract(){
        System.out.println( "RealStar.signContract()" );
    }
    / * @Override * / 
    パブリック 無効bookTicket(){
        System.out.println( "RealStar.bookTicket()" );
    }
    / * @Override * / 
    パブリック 無効playShow(){
        System.out.println( "ジェイ.playShow()"); // 操作の真の役割:実際のビジネス・ロジック
    }
     / * @Override * / 
    パブリック 無効collectMoney(){
        System.out.println( "RealStar.collectMoney()" );
    }
}

演技の役割プロセッサ:

パッケージproxy.dynamicProxyを。
 
輸入java.lang.reflect.InvocationHandler;
輸入java.lang.reflect.Methodオブジェクト;
 
/ * プロセッサ* /

パブリック クラス StarHandler 実装のInvocationHandler {
     プライベートスターREALSTAR; // 真の役割
    / **
     *のすべてのコントロールは、プロセスinvokeメソッドであります
     *プロキシ:プロキシクラス
     *方法:メソッドを呼び出しています
     *のArgs:パラメータ法
     * / 
    / * @Override * / 
    パブリックオブジェクトを呼び出し(オブジェクトプロキシ、メソッドのメソッド、オブジェクト[]引数)がスローのThrowableを{
        対象物体 = NULL ;
        System.out.println( "本物.....ロールコールの前に" );
         IF(。Method.getName()等号( "playShow" )){
            物体 = Method.invoke(REALSTAR、引数); // 呼び出しを活性化するための方法    
        }
        System.out.println(「本当の役割・コールの後、プロセス.....」);
         戻り値のオブジェクト。
    }
    / * 実際の役割コンストラクタ* /によって初期化
    公共StarHandler(スターREALSTAR){
         スーパー();
         この .realStar = REALSTAR。
    }
}
プロキシモードをテストします。
パブリック 静的 ボイドメイン(文字列[]引数){
     // 真实角色 
    スターrealStar = 新しいRealStar()。
    // 处理器 
    StarHandlerハンドラ= 新しいStarHandler(realStar)。
    // 代理类 
    スタープロキシ=(スター)たとえば、Proxy.newProxyInstanceローダ(ClassLoader.getSystemClassLoader()、新しいクラス[] {スター。クラス}、ハンドラ)。
    proxy.playShow(); // プロキシクラスのメソッド呼び出しを歌っ:呼び出しは、実際の役割を実行する真の方法であり、

第三に、ケーススタディ

  • 持参の代理店モデルシステムアーキテクチャとコード構造の導入のメリット:いくつかのケースでは、不適切またはオブジェクトではありませんが、別のオブジェクトへの直接参照され、プロキシオブジェクトは、クライアントとターゲットオーディエンスの間の仲介の役割を果たすことができます、いくつかの操作は、元のオブジェクトに対して実行されてもよいです。そして彼は、仲介役を果たし、クライアントとターゲット・オブジェクトの役割との間に、対象物を保護することができます。そして、高い拡張性、機能性がより明確に分けることができ、後のメンテナンスに役立ちます。

  • 前記多型と抽象化モジュールパッケージの使用方法:本当に演技役割と役割実装クラスの実装クラスが実装されている役割の転送抽象インタフェーススター。そして、クライアントと観客の効果との間の仲介保護的役割と観客を再生することができ、異なるクラスの中に個別包装されました。そしてそれは、拡張することができる機能は、ポスト・メンテナンスを支援し、より明確に分けることができます。また、このモードは利点の嘘を引用しています。

  • モジュール間の結合:ターゲット・オブジェクトとクライアントを分離することができるプロキシモードは、ある程度の結合システムを減らすため。

 

 

おすすめ

転載: www.cnblogs.com/ai469/p/11989911.html