ダイナミックエージェント[jdkで実装]

3051 ワード

一.javaのjdkダイナミックエージェント
     JDKで実装された動的エージェントは、エージェントされたオブジェクトにインタフェースを実装する必要があります.実は、現主はjava.lang.reflect.Proxyクラスとjava.lang.reflect.InvocationHandlerインタフェースを介しています.
 
二.本章では、javaのjdk動的エージェントの実装を「チケット売り場エージェント駅チケット」の例で実証する.完全なコードは以下の通りである.
 
1.[エージェントターゲットが実装するインタフェース]
package structuralPattern.proxy.jdk;
/**
 * @ClassName: ITarget 
 * @Description:    
 * @author Liyongbin
 * @date 2011-2-8   12:52:09 
 * @version V1.0
 */
public interface ITicket {
	public abstract void saleTicket();
}

 
2.乗車券[被代理ターゲット]
package structuralPattern.proxy.jdk;
/**
 * @ClassName: Train 
 * @Description:  
 * @author Liyongbin
 * @date 2011-2-8   12:54:36 
 * @version V1.0
 */
public class Train implements ITicket{

	@Override
	public void saleTicket() {
		System.out.println("   ");
	}
}

 
3.チケット販売サービス
package structuralPattern.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * @ClassName: BuyTicketService 
 * @Description:    
 * @author Liyongbin
 * @date 2011-2-8   01:02:36 
 * @version V1.0
 */
public class BuyTicketService implements InvocationHandler {
	//      
	private Object target;
	
	public BuyTicketService(Object target) {
		this.target=target;
	}
	//
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		deliverTicket();
		method.invoke(target, args);
		discountTicket();
		return null;
	}
	//"  "     1
	public void deliverTicket() {
		System.out.println("      ");
	}
	//"  "     2
	public void discountTicket() {
		System.out.println("      ");
	}
}

 
4.動的エージェント
package structuralPattern.proxy.jdk;

import java.lang.reflect.Proxy;

/**
 * @ClassName: DynamicProxy_JDK 
 * @Description:     
 * @author Liyongbin
 * @date 2011-2-8   12:58:45 
 * @version V1.0
 */
public class DynamicProxy_JDK {
	public Object getProxy(Object target) {
		return Proxy
				.newProxyInstance(target.getClass().getClassLoader(), target
				.getClass().getInterfaces(), new BuyTicketService(target));
	}
}

 
5.テスト
package structuralPattern.proxy.jdk;

public class DynamicProxyTest {
	public static void main(String[] args) {
		//     
		DynamicProxy_JDK dp = new DynamicProxy_JDK();
		//  
		ITicket ticket = (ITicket) dp.getProxy(new Train());
		//      
		ticket.saleTicket();
	}
}

 
6.運転結果:
    チケット宅配サービス    切符を売る    チケット割引サービス