1分でJAVAエージェントモードを知る

12313 ワード

プロキシモードの定義:他のオブジェクトにプロキシを提供し、そのオブジェクトへのアクセスを制御する.
リモートエージェント:異なる地理的オブジェクトにローカルエリアネットワーク代表オブジェクトを提供する
仮想エージェント:必要に応じてリソース消費が大きいオブジェクトを遅延ロードし、本当にこのオブジェクトが必要なときに作成します.
≪プロキシの保護|Proxy Protection|ldap≫:オブジェクトに対する権限の制御
インテリジェントリファレンスエージェント:エージェントオブジェクトに追加のサービスを提供します.
次に、静的エージェントと動的エージェントを使用して、スマートリファレンスエージェント機能を実装します.
静的エージェント:エージェントと被エージェントオブジェクトは、エージェントの前に同じインタフェースを実装しているか、同じ抽象クラスを継承しているかを決定します.
シーン1:私たちは車を走行する機能を持っています.私たちは今、車に走行時間を記録する必要があります.以下は具体的な実現です.
package com.zs.spring.demo1;
//      
public interface Moveable {
    public void move();
}

次は、エージェントクラスに使用されていない従来のアプローチです.
package com.zs.spring.demo1;

import java.util.Random;

public class Car implements Moveable {

    public Car() {
        // TODO Auto-generated constructor stub
    }
    //    
    @Override
    public void move() {
        long begen= System.currentTimeMillis();
        // TODO Auto-generated method stub
        System.out.println("      ");
        try {
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("     ");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("      "+(end-begen)+"  ");
    }

    public static void main(String[] args) {
        Car c =new Car();
        c.move();
    }
}

   :
      
     
      701  

次に、静的エージェント実装を示します.
package com.zs.spring.demo1;

import java.util.Random;

public class Car2  extends Car{

        @Override
        public void move() {
            long begen= System.currentTimeMillis();
            // TODO Auto-generated method stub
            System.out.println("      ");
            super.move();
            long end = System.currentTimeMillis();
            System.out.println("      "+(end-begen)+"  ");
        }

}

上では継承を用いて代理新規Car 2というクラスを実現し,継承Car書き換えmove()メソッドを用いてサブクラスで親クラスの走行メソッドを呼び出し,走行時間を記録してCar 2サブクラスに格納した.
次に、集約方式をエージェントとして用いる集約方式とは、あるクラスで別のクラスを呼び出す集約である.
package com.zs.spring.demo1;

public class Car3 implements Moveable{
    private Car car;

    public Car3(Car car){
        this.car=car;
    }
    @Override
    public void move() {
        long begen= System.currentTimeMillis();
        System.out.println("      ");
        car.move();
        long end = System.currentTimeMillis();
        System.out.println("      "+(end-begen)+"  ");

    }

  public static void main(String[] args) {
      Car c =new Car();
      Car3 car3 =new Car3(c);
      car3.move();
}
}

以上のようなエージェントは、CarクラスとエージェントクラスCar 3と同様に、Moveableインタフェースがエージェントクラスにおいて1つのCarクラスオブジェクトを定義し、使用時にまずCarクラスをCar 3エージェントクラスに渡す記録時間を増やす特性を実現する.
確かに継承の仕方にも欠陥があります.たとえば、時間エージェントだけでなく、ログエージェントと権限エージェントも追加する必要があります.ログエージェントクラスと権限エージェントクラスを再構築する必要がありますか.ログ–時間–権限を記録するには、ログエージェントクラスがCar時間エージェントクラスを継承する必要があります.ログクラス権限エージェントクラスは時間エージェントクラスを継承します.レイヤの継承はエージェントとして機能し、時間-ログ-権限を先に記録する可能性がある場合は、拡張性が低すぎるのではないでしょうか.
次に、集約エージェント方式を使用して、実装ログと時間エージェントをシミュレートします.
//     
package com.zs.spring.demo1;

public class CarLogProxy implements Moveable{
    private Moveable car;

    public CarLogProxy(Moveable car){
        this.car=car;
    }
    @Override
    public void move() {
        System.out.println("    ......");
        car.move();
        System.out.println("    ......");

    }
}

タイムエージェントクラス
package com.zs.spring.demo1;

public class CarTimeProxy implements Moveable{
    //       car          Moveable        
        
    private Moveable car;
    public CarTimeProxy(Moveable car){
        this.car=car;
    }
    @Override
    public void move() {
        long begen= System.currentTimeMillis();
        System.out.println("      ");
        car.move();
        long end = System.currentTimeMillis();
        System.out.println("      "+(end-begen)+"  ");

    }

  public static void main(String[] args) {
      Car c =new Car();
      CarTimeProxy car3 =new CarTimeProxy(c);
      CarLogProxy  clp = new CarLogProxy(car3);
      clp.move();
}


}
     :
    ......
      
     
      606  
    ......

では、今からログを記録します.記録時間です.私は今、時間を記録してからログを記録したいと思っています.継承のようにエージェントクラスの継承を書く必要はありません.
  public static void main(String[] args) {
      Car c =new Car();
      CarLogProxy  clp = new CarLogProxy(c);
      CarTimeProxy car3 =new CarTimeProxy(clp);
      car3.move();
}
     :
      
    ......
     
    ......
      852  


したがって、できるだけ集約エージェントを使用すると拡張性が高くなります.
動的エージェント:動的エージェントとは、実行時にclassを生成することです.このclassは、一連のインタフェース(interface)を実装する必要があります.動的エージェントクラスを使用する場合は、InvocationHandlerインタフェースを実装する必要があります.
package com.zs.spring.demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class CarHandle implements InvocationHandler{
    private Object target;
    public CarHandle(Object target) {
        this.target=target;
    }
    /**
     *   :
     * proxy:      
     * method:        
     * args[]      
     *    :object
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        long begen= System.currentTimeMillis();
        System.out.println("    ");
        method.invoke(target);
        long end = System.currentTimeMillis();
        System.out.println("    "+(end-begen)+"  ");
        return null;
    }


    public static void main(String[] args) {
        //       
        Car c =new Car();
        //            CarHandle
        InvocationHandler invo = new CarHandle(c);
        //  class  
        Class> invoCalss =c.getClass();
        /**
         * loader     
         * interface         
         * h     CarHandle
         */
    Moveable m =(Moveable) Proxy.newProxyInstance(invoCalss.getClassLoader(),invoCalss.getInterfaces(),invo);
    m.move();
    }

}
     
      
     
      133  

以上JDKがInvocationHandlerを使って実現したダイナミックエージェントこの様子は自動車類でも列車機でも彼の走行時間を得ることができますつまりどんな種類でもエージェントすることができます