Java 代理设计模式

public class TestFactory3 {
	public static void main(String[] args)throws Exception {
		Vehicle c = SimpleFactory3.getVehicle("com.atguigu.test12.QQ");
		c.run();
		
		Vehicle c2 = SimpleFactory3.getVehicle("com.atguigu.test12.Aoto");
		c2.run();
		
		Vehicle c3 = SimpleFactory3.getVehicle("com.atguigu.test12.Atguigu");
		c3.run();
		
		
	}
}
interface Vehicle{
	void run();
}
class QQ implements Vehicle{

	@Override
	public void run() {
		System.out.println("qq车");
	}
	
}
class Aoto implements  Vehicle{

	@Override
	public void run() {
		System.out.println("奥拓");
	}
	
}
class Atguigu implements Vehicle{

	@Override
	public void run() {
		System.out.println("尚硅谷");
	}
	
}
class SimpleFactory3{
	public static Vehicle getVehicle(String className)throws Exception{
		Class clazz = Class.forName(className);
		return (Vehicle) clazz.newInstance();
	}
}

动态代理:

/*
 * 3、动态代理模式:Spring框架中
 * 优点:一个代理工作处理器,可以替多个代理主题(接口)代理工作,只有代理工作内容一样就可以。
 * 需要:
 * (1)编写一个代理工作处理器的类,这个类必须实现一个接口InvocationHandler
 * (2)用JDK中提供了一个Proxy类,来创建代理类的对象
 * new ProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
 * 参数一:被代理者的类加载器对象
 * 参数二:被代理者实现的接口们
 * 参数三:代理者替被代理者要完成的工作的处理器对象
 * 
 * (3)调用方法
 */
public class TestProxy {
	@Test
	public void test01() {
		AImpl a = new AImpl();//被代理者
		
		ClassLoader loader = a.getClass().getClassLoader();
		Class<?>[] interfaces = a.getClass().getInterfaces();
		Handler h = new Handler(a);
		
		A proxy = (A) Proxy.newProxyInstance(loader, interfaces, h);
		proxy.a();
	}
	
	@Test
	public void test02() {
		BImpl b = new BImpl();//被代理者
		
		ClassLoader loader = b.getClass().getClassLoader();
		Class<?>[] interfaces = b.getClass().getInterfaces();
		Handler h = new Handler(b);
		
		B proxy = (B) Proxy.newProxyInstance(loader, interfaces, h);
		proxy.b();
	}
}
class Handler implements InvocationHandler{
	private Object target;//被代理者对象
	
	public Handler(Object target) {
		super();
		this.target = target;
	}

	/*
	 * 参数一:代理类的对象
	 * 参数二:被代理者要执行的方法
	 * 参数三:被代理者要执行的方法需要的实参列表
	 * 这个方法不是程序调用的,是一会执行代理类对象的方法时自动调用
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println(method.getName() + "方法开始执行");
		long start = System.currentTimeMillis();
		
//		method.invoke(obj, args);//obj是要求写被代理者对象
		Object value = method.invoke(target, args);
		
		long end = System.currentTimeMillis();
		System.out.println("运行时间:" + (end-start));
		System.out.println(method.getName() + "方法执行结束");
		
		
		return value;
	}
	
}

//主题1
interface A{
	void a();
}
//被代理者1
class AImpl implements A{

	@Override
	public void a() {
		System.out.println("a方法被执行");
	}
	
}
//主题2
interface B{
	void b();
}
//被代理者2
class BImpl implements B{

	@Override
	public void b() {
		System.out.println("b方法被执行");
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值