代理者模式

* 动态代理

*

* @author Administrator

* 动态代理的主要意图就是解决审计问题,也就是横切面编程,在不改变我们已有代码结构的情况下增强或控制对象的行为。

* 动态代理实现代理的职责,业务逻辑Subject实现相关的逻辑功能,两者之间没有必然的相互耦合关系。

* 通知从另一个切面切入,最终在高层模块也就是Client进行耦合 完成逻辑封装任务。

* 要实现动态代理的首要条件就是:被代理者必须实现一个接口。

 

mport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


// 抽象主题
interface Subject {
	public void doSomething(String str);
}

// 真实主题
class RealSubject implements Subject {

	@Override
	public void doSomething(String str) {
		System.out.println("do something!---->" + str);
	}

}


/*********************************通知的实现************************************/
interface IAdvice{
	public void exec();
}

class BeforeAdvice implements IAdvice{

	@Override
	public void exec() {
		System.out.println("我是前置通知!");
	}
}
/*********************************通知的实现************************************/

//动态代理的Handler类
class MyInvocationHandler implements InvocationHandler {
	private Object target = null;

	public MyInvocationHandler(Object _obj) {
		this.target = _obj;
	}

	//接管所有方法的实现
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return method.invoke(this.target, args);
	}
}


// 动态代理类
class DynamicProxy<T> {
	public static <T> T newProxyInstance(Subject subject) {
		ClassLoader loader=subject.getClass().getClassLoader();
		Class<?>[] interfaces=subject.getClass().getInterfaces(); 
		InvocationHandler handler=new MyInvocationHandler(subject);
		
		//寻找JoinPoint连接点,AOP框架使用元数据定义
		if (true) {
			//执行一个前置通知
			(new BeforeAdvice()).exec();
		}
		
		//重新生成一个对象
		return (T) Proxy.newProxyInstance(loader, interfaces, handler);
	}
}

public class Main {
	public static void main(String[] args) {
		// 定一个主题
		Subject subject = new RealSubject();
		
		// 定义主题代理,使用自己封装的动态代理者
		Subject proxy = DynamicProxy.newProxyInstance(subject);
		
		// 代理的行为
		proxy.doSomething("finish!");
		
		//使用原生的动态代理者
		Subject proxy1=(Subject) Proxy.newProxyInstance(
				subject.getClass().getClassLoader()
				, subject.getClass().getInterfaces()
				, new MyInvocationHandler(subject));
		
		proxy1.doSomething("doSomething!");
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值