エージェントモードのjava実装


プロキシモードの定義
プロキシ・モードは、別のオブジェクトへのアクセスを制御するために、代替またはプレースホルダを提供します.エージェント・モードを使用して、リモート・オブジェクト、オーバーヘッドの大きいオブジェクト、またはセキュリティ管理が必要なオブジェクトのいずれかを対象としたオブジェクトへのアクセスを制御します.エージェント・モードは、主に3つのロールに関連します.1)エージェント・ロール(Proxy)2)抽象トピック・ロール(Subject)3)リアル・トピック・ロール(Real Subject)
≪プロキシ・ロール|Proxy Roles|ldap≫:プロキシがエンティティにアクセスできるように参照を保存します.RealSubjectとSubjectのインタフェースが同じ場合、ProxyはSubjectを参照するため、エージェントはエンティティの代わりに使用できます.エンティティへのアクセスを制御し、作成と削除を担当することもできます.他にも、リモートエージェントが要求とそのパラメータを符号化し、異なるアドレス空間のエンティティに符号化された要求を送信する機能があります.仮想エージェントは、コストの高いオブジェクトを作成する代表として、オブジェクトを本当に必要としているときに作成することができます.保護エージェントは、呼び出し元がリクエストを実装するために必要なアクセス権を持っているかどうかを確認します.
≪抽象トピック・ロール|抽象トピック・ロール|抽象トピック・ロール|ldap≫:リアル・トピック・ロールと抽象トピック・ロールProxyの共通インタフェースを定義します.これにより、リアル・トピック・ロールを使用するときにエージェント(抽象トピック・ロール)を使用できます.
≪リアル・トピック・ロール|Real Topics Role|ldap≫:エージェント・ロールが表す特定のオブジェクトを定義します.
いくつかのエージェントモードのjava実装
リモートエージェントのjavaインプリメンテーションは、Java RMIのEclipseでのインプリメンテーションを参照することができる.
本稿では,仮想エージェント(Virtual Proxy)と保護エージェント(Protection Proxy)の解析と実装を主に行った.
仮想エージェントは、コストの高いオブジェクトを作成する代表として、常にオブジェクトが必要になるまで作成されます.オブジェクトが作成前と作成中の場合、仮想エージェントがオブジェクトの身代わりを演じます.オブジェクトが作成されると、プロキシはリクエストをオブジェクトに直接委任します.コードクリップは次のようになります.
ImageProxyエージェントは、共通のインタフェースIconを実装し、ImageIconがnullの場合、imageProxyは自身のコンテンツを表示し、ImageIconが空でない場合、imageIconにそのコンテンツの表示を依頼します.
import java.awt.Component;
import java.awt.Graphics;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;

public class ImageProxy implements Icon {

	ImageIcon imageIcon;
	URL imageURL;
	Thread retrievalThread;
	boolean retrieving=false;
	
	//      url       。                
	public ImageProxy(URL url){
		imageURL=url;
	}
	
	//        ,        。       ,  imageIcon  
	public int getIconWidth(){
		if(imageIcon!=null){
			return imageIcon.getIconWidth();
		}else
			return 800;
	}
	
	public int getIconHeight(){
		if(imageIcon!=null){
			return imageIcon.getIconHeight();
		}else
			return 600;
	}
	
	//            ,      
	public void paintIcon(final Component c,Graphics g,int x,int y){
		if(imageIcon!=null){
			//      icon,        
			imageIcon.paintIcon(c, g, x, y);
		}else{
			//       “   ”   
			g.drawString("Loading CD cover,please wait...",x+300,y+190);
			if(!retrieving){
				retrieving=true;
				retrievalThread=new Thread(new Runnable(){
					public void run(){
						try{
							imageIcon=new ImageIcon(imageURL,"CD Cover");
							c.repaint();
						}catch(Exception e){
							e.printStackTrace();
						}
					}
				});
				retrievalThread.start();
			}
		}
	}
}

保護エージェントについて話す前に、動的エージェントについて理解する必要があります.Javaはjavaにあります.lang.reflectパッケージには独自のエージェントサポートがあります.このパッケージを使用すると、実行時にエージェントクラスを動的に作成し、1つ以上のインタフェースを実装し、指定したクラスにメソッドの呼び出しを転送できます.実際のクラスは実行時に作成されるので、このテクノロジーをダイナミックエージェントと呼びます.ここではInvocationHandlerを使用してエージェントの動作を実現し、javaは実際のエージェントクラスオブジェクトの作成を担当します.メソッド呼び出しが発生したときに何をするかを知っているhandlerを提供するだけです.コードクリップは次のとおりです.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//          InvocationHandler  
public class OwnerInvocationHandler implements InvocationHandler {

	PersonBean person;
	public OwnerInvocationHandler(PersonBean person){
		this.person=person;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws IllegalAccessException {
		try{
			if(method.getName().startsWith("get")){
				return method.invoke(person, args);
			}else if(method.getName().equals("setHotOrNotRating")){
				throw new IllegalAccessException();
			}else if(method.getName().startsWith("set")){
				return method.invoke(person, args);
			}
		//            ,      
		}catch(InvocationTargetException e){
			e.printStackTrace();
		}
		// TODO Auto-generated method stub
		return null;
	}
	

}