Javaの静的エージェント

2892 ワード

静的エージェントを使用するには、エージェントクラスと、エージェントクラスとターゲットクラス(拡張されるエージェントのクラス)が同じインタフェースを実装する必要があります.まずインタフェースを定義します.中には2つの方法があります.
public interface ISomeService {
    public String doMethod1();
    public String doMethod2();
}

次に、ターゲットクラスの実装について説明します.
public class ISomeServiceImpl implements ISomeService {
    @Override
    public String doMethod1() {
        System.out.println("  1  ");
        return "abc";
    }

    @Override
    public String doMethod2() {
        System.out.println("  2  ");
        return "def";
    }
}

メソッド1とメソッド2は、小文字の文字列を返す必要があります.次に、メソッド1が返す文字列abcが大文字になり、メソッド2が返す文字列defに「nihao」を追加します.△前提条件として、ターゲットクラスを動かすことはできません.つまり、ISomeServiceImplで変更することはできません.
次にエージェントクラスです.Proxyと名付けられ、上記のインタフェースも実装されます.

public class Proxy implements ISomeService{
    ISomeService target = new ISomeServiceImpl();

    public Proxy(ISomeService target) {
        this.target = target;
    }

    @Override
    public String doMethod1() {
        //      ,         
        System.out.println("        ");
        String result = target.doMethod1();
        result = result.toUpperCase();
        System.out.println("        ");
        //      ,            
        return result ;
    }

    @Override
    public String doMethod2() {

        System.out.println("        ");
        String result = target.doMethod2();
        result = result.concat(" ni hao ");
        System.out.println("        ");
        //      ,            

        return result ;
    }
}

以上のコードから,エージェントクラスにターゲットクラスのインスタンス,targetがあり,それをバンドパラメトリックコンストラクタに転送する必要があることが分かる.これでエージェントクラスとターゲットクラスが対応します.エージェントクラス実装の2つのメソッドのうち,真の実行メソッドはターゲットクラスインスタンスtargetであるが,実行前後に操作(すなわちエージェント,強化)することができる.図に「開始前」、「開始後」の位置を印刷します.
それからTestで結果を見ることができます.
public class MyTest {
    public static void main(String[] args) {
        ISomeService target = new ISomeServiceImpl();
        //      target
        ISomeService proxy = new Proxy(target);
        // target   Proxy    ,     
        String str1 =  proxy.doMethod1();
        //   proxy.doMethod1     , target    1,          。
        System.out.println(str1);
        String str2 =  proxy.doMethod2();
        System.out.println(str2);
    }
}

出力結果は次のとおりです.
エージェント強化開始前に1メソッドを実行エージェント強化終了後ABCエージェント強化開始前に2メソッドを実行エージェント強化終了後def ni hao 
 
静的エージェントの欠点1:エージェントクラスとターゲットクラスが同じインタフェースを実現するため,論理的に重複するコードが多く含まれる.また,インタフェースにメソッドを追加すると,実装クラスとエージェントクラスも対応する追加メソッドが多くなり,メソッドが多くなるとコード冗長の問題が生じる(同じ/類似のコードが多すぎて複雑に感じられる).
静的エージェントの欠点2:我々のエージェントクラスは1つのタイプのターゲットクラスしかエージェントできません.例えば、上記の例では、我々のProxyは、ISomeServiceImplサービスしかできません.他のクラスがエージェントを必要とする場合、我々のエージェントクラスは使用できません.他のクラスに、エージェントクラスを書いて、使用しなければなりません.静的エージェントは拡張に不利です.