Javaのエージェントモードについて

3815 ワード

プロキシ・モードは、他のオブジェクトにプロキシを提供してオブジェクトへのアクセスを制御したり、実際のオブジェクトの代わりに追加または異なる操作を提供するために挿入したりします.
エージェント・モードの役割:
抽象ロール:リアルオブジェクトとエージェントオブジェクトの共通インタフェース.≪プロキシ・ロール|Proxy Roles|ldap≫:プロキシ・オブジェクト・ロールには、リアル・オブジェクトを操作できるように、リアル・オブジェクトへの参照が含まれています.また、プロキシ・オブジェクトは、リアル・オブジェクトと同じインタフェースを提供し、リアル・オブジェクトの代わりにいつでも使用できます.同時に、プロキシオブジェクトは、実際のオブジェクト操作を実行するときに、実際のオブジェクトをカプセル化することに相当する他の操作を追加できます.≪リアル・ロール|Real Role|emdw≫:エージェント・ロールが表すリアル・オブジェクトは、最終的に参照するオブジェクトです.
これらのロールを説明するには,静的エージェントモードが最もよく理解され,まず抽象的なロールである.
interface Interface{
	void doSomething();
	void somethingElse(String arg);
}

抽象クラスまたはインタフェースを定義します.エージェントロールと実際のロールが実現するアクションまたは動作です.
次に、実際のロールを定義します.ビジネスを実際に処理するクラスです.
class RealObject implements Interface{

	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("doSomething");
	}

	public void somethingElse(String arg) {
		// TODO Auto-generated method stub
		System.out.println("somethingElse "+arg);
	}
	
}

実際のビジネス処理は実際のロール処理であるため、エージェントロールには実際のロールの参照が必要です.
class SimpleProxy implements Interface{

	private Interface proxied;
	
	public SimpleProxy(Interface proxied){
		this.proxied=proxied;
	}
	
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("SimpleProxy doSometing");
		proxied.doSomething();
	}

	public void somethingElse(String arg) {
		// TODO Auto-generated method stub
		System.out.println("SimpleProxy somethingElse "+arg);
		proxied.somethingElse(arg);
	}
	
}

エージェントロールでは、追加の操作を追加できます.この静的エージェントにより,エージェントモードの意味を大まかに理解できる.
JAvaの動的エージェントは、エージェントを動的に作成し、エージェントメソッドの呼び出しを動的に処理することができる.基本的な手順は次のとおりです.
1.invokeメソッドを実装する必要がある実装インタフェースInvocationHandlerのクラスを作成します.2、エージェントされるクラスおよびインタフェースを作成します.3、Proxyの静的方法newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h)によって代理を作成する.4.エージェントによるメソッドの呼び出し.
InvocationHandlerはエージェントインスタンスの呼び出しハンドラによって実装されるインタフェースであることがAPIによって理解される.各エージェントインスタンスには、関連する呼び出しハンドラがあり、その呼び出しハンドラのinvokeメソッドに割り当てられます.このインタフェースにはinvokeメソッドが含まれており、3つのパラメータProxyがメソッドを呼び出すエージェントインスタンスがあり、一般的にこのパラメータは使用できません.methodは、プロキシインスタンス上で呼び出されたインタフェースメソッドのMethodインスタンスに対応します.argsには、受信エージェントインスタンス上のメソッドが呼び出すパラメータ値のオブジェクト配列が含まれ、インタフェースメソッドがパラメータを使用しない場合nullになります.
まず、InvocationHandlerインタフェースを実装します.
private Object proxied;

public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		System.out.println(""+proxy.getClass()+","+method+","+args);
		if(args!=null){
			for(Object arg:args){
				System.out.println(" "+arg);
			}
		}
		return method.invoke(proxied, args);
	}

リアルロールと抽象ロールの指定(インタフェース)
interface Interface{
	void doSomething();
	void somethingElse(String arg);
}

class RealObject implements Interface{

	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("doSomething");
	}

	public void somethingElse(String arg) {
		// TODO Auto-generated method stub
		System.out.println("somethingElse "+arg);
	}
	
}
そしてProxyを通過する.新ProxyInstance()メソッドによるエージェントオブジェクトの取得
Interface proxy=(Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), 
				real.getClass().getInterfaces(), new DynamicProxyHandler(real));
はjavaダイナミックエージェントの全プロセスを実現する.