<黑马程序员>代理模式总结-动态代理

------- android培训java培训、期待与您交流! ----------

上一篇文章已经总结了静态代理模式,由于实际开发中,对于很多业务类都需要代理的时,以静态代理实现的话,会写很多代码,这些代码也就是垃圾代码,那么JDK中给大家提供了动态代理的功能,这样可以一个代理类,可以有N个业务逻辑类调用,大大节省了程序员们的时间,提高了工作效率,以及减少代码冗余度。那现在根据上一个例子,改成一个动态代理例子

1、定义一个业务逻辑接口类

<div style="text-align: left;"><pre name="code" class="java">package com.proxy.dynamic_proxy;

/*
 * 演示动态代理类
 * 
 * 功能:定义一个接口,用于模拟对数据库进行操作
 * 
 * @author lijl
 * */
public interface DatabaseInterface {
	//插入
	public void Insert();
	
	//删除
	public void Delete();
	//修改
	public void Update();

	//查询
	public void Select();
}


 

2、定义业务逻辑类

package com.proxy.dynamic_proxy;
/*
 * 演示动态代理类
 * 
 * 功能:定义一个实现类,即业务逻辑类
 * 
 * @author lijl
 * */
public class DynamicProxyImpl implements DatabaseInterface {

	@Override
	public void Insert() {
		// TODO Auto-generated method stub
		System.out.println("StaticProxy_Impl.Insert()...........");

	}

	@Override
	public void Delete() {
		// TODO Auto-generated method stub
		System.out.println("StaticProxy_Impl.Delete()...........");
	}

	@Override
	public void Update() {
		// TODO Auto-generated method stub
		System.out.println("StaticProxy_Impl.Update()...........");
	}

	@Override
	public void Select() {
		// TODO Auto-generated method stub
		System.out.println("StaticProxy_Impl.Select()...........");
	}


}

3、定义代理类
package com.proxy.dynamic_proxy;
/*
 * 演示动态代理类
 * 
 * 功能:定义一个代理类,实现InvocationHandler接口
 * InvocationHandle接口有一个方法:
 * public Object invoke(Object peoxy, Method method, Object[] args) throws Throwable{return null}
 * 
 * 其中:
 * 	proxy:逻辑类的对象
 *  method:通过反射逻辑类对象proxy的方法
 *  args:调用方法时传递的参数
 * 
 * 每调用本类的对象时候,都会触发invoke这个方法。
 * 
 * @author lijl
 * */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler {
	private DynamicProxyImpl dpi;
	public DynamicProxy(DynamicProxyImpl dpi){
		this.dpi = dpi;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object pi = null;
		LogBegin();//将日志放在这里
		pi = method.invoke(dpi, args);
		LogEnd();//将日志放在这里
		// TODO Auto-generated method stub
		return pi;
	}
	private void LogBegin(){
		System.out.println("DynamicProxy.LogBegin()");
	}
	private void LogEnd(){
		System.out.println("DynamicProxy.LogEnd()");
	}

}


4、主函数执行

package com.proxy.dynamic_proxy;

import java.lang.reflect.Proxy;

public class DynamicProxy_main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DynamicProxyImpl dpi = new DynamicProxyImpl();
		DynamicProxy dp = new DynamicProxy(dpi);
		
		//使用Proxy.newProxyInstance,返回动态代理对象
		DatabaseInterface di = (DatabaseInterface)Proxy.newProxyInstance(
				dpi.getClass().getClassLoader(), //业务逻辑类的加载器
				dpi.getClass().getInterfaces(), //业务逻辑类使用的接口,如果多个接口,这个是数组
				dp);//实现InvocationHandler的代理类
		di.Insert();
		di.Select();
		di.Update();
		di.Delete();
	}
		

}



结果如下:

DynamicProxy.LogBegin()
StaticProxy_Impl.Insert()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Select()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Update()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Delete()...........
DynamicProxy.LogEnd()

 -------android培训JAVA培训、期待与您交流! ----------

--------详细请查看www.itheima.com-------------



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值