动态代理

一.动态代理与继承和装饰者模式相比

增强手段有三种

1.继承:

特点:被增强对象不能变;增强内容不能变

2.装饰者模式

特点:被增强对象可变,但增强内容不可变

3.动态代理

特点:被增强对象可变,增强内容可变

二. 用代理工厂创建代理对象并使用

目标对象:manWaiter类,它实现了Waiter接口

增强对象:接口BeforeAdvice#before():前置增强对象;

     接口 AfterAdvice#after():后置增强对象

1. 代理工厂类

/*
代理对象工厂类,它用来生成代理对象
需要的参数:目标对象,增强对象
*/
public class ProxyFactory {
/*
设置三样东西:targetObject,BeforeAdvice,AfterAdvice
创建代理对象:createProxy()
*/
private Object targetObject;//目标对象
private BeforeAdvice beforeAdvice;//前置增强
private AfterAdvice afterAdvice;//后置增强

/*
得到代理对象
*/
public Object createProxy(){
/*
1.三大参数
*/
ClassLoader loader = this.getClass().getClassLoader();
Class[] interfaces = targetObject.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
在调用目标对象的方法时会调用这里的内容
*/
if(beforeAdvice != null){//执行前置增强
beforeAdvice.before();
}

Object result = method.invoke(targetObject,args);//执行目标对象的目标方法

if (afterAdvice != null){//执行后置增强
afterAdvice.after();
}
return result;//返回目标方法的返回值

}
};

/*
2.用三大参数得到代理对象
*/
Object proxyObject = Proxy.newProxyInstance(loader,interfaces,h);
/*
3.返回代理对象
*/
return proxyObject;
}

public Object getTargetObject() {
return targetObject;
}

public void setTargetObject(Object targetObject) {
this.targetObject = targetObject;
}

public BeforeAdvice getBeforeAdvice() {
return beforeAdvice;
}

public void setBeforeAdvice(BeforeAdvice beforeAdvice) {
this.beforeAdvice = beforeAdvice;
}

public AfterAdvice getAfterAdvice() {
return afterAdvice;
}

public void setAfterAdvice(AfterAdvice afterAdvice) {
this.afterAdvice = afterAdvice;
}
}

2. 利用代理工厂实现动态代理
  /*
    利用代理工厂实现动态代理
    1.创建工厂
    2.给工厂设置东西
    --目标对象 setTargetObject(xxx)
    --前置增强 setBeforeAdvice(该接口的实现)
    --后置增强 setAfterAdvice(该接口的实现)
    3.调用createProxy()得到代理对象
    --执行代理对象方法时
        1)执行前置增强的方法
        2)目标对象的目标方法
        3)执行后置增强的方法
     */
public class Demo1 {

@Test
public void fun1(){
/*
1.创建工厂
*/
ProxyFactory factory = new ProxyFactory();
/*
2.给工厂设置:目标对象,前置增强,后置增强
*/
factory.setTargetObject(new manWaiter());
factory.setBeforeAdvice(new BeforeAdvice() {
@Override
public void before() {
System.out.println("您好");
}
});
factory.setAfterAdvice(new AfterAdvice() {
@Override
public void after() {
System.out.println("再见");
}
});
/*
3.调用createProxy得到代理对象
*/
Waiter manWaiter = (Waiter) factory.createProxy();
/*
4.调用目标对象的目标方法
*/
manWaiter.serve();
}
}
 

posted on 2019-04-02 10:15  rachelgarden  阅读(239)  评论(0编辑  收藏  举报

导航