proxy
作用:通过代理来控制对对象的访问
可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后
做后置处理。(即:AOP的微观实现!)
现实生活中的 经纪人,中介公司
比如:歌手的演唱会: 经纪人安排 面谈 合同签字 机票车辆 歌手唱歌 收尾款
对于每个歌手流程都是一样的 就 歌手唱歌不同
静态代理
RealStar和StarProxy 都实现Star接口,StarProxy有一个 RealStar成员变量,然后在调用StarProxy相应方法只要调用它,就调用其成员变量RealStar相应实现的方法(但是可以在前后加相应的操作)
动态代理
1)歌手接口
package com.xiaoqiang.gof23.structureModel.proxy.dynamicProxy;
/**
* @author xiaoqiang
*/
public interface Star {
/*面谈*/
void confer();
/*签合约*/
void signContract();
/*订票*/
void bookTicket();
/*唱歌*/
void sing();
/*收尾款*/
void collectMoney();
}
2)歌手的具体实现类
package com.xiaoqiang.gof23.structureModel.proxy.dynamicProxy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("RealStar(歌手本人).sing()");
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
3)代理类
package com.xiaoqiang.gof23.structureModel.proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author xiaoqiang
*/
public class StarHandler implements InvocationHandler {
private Star realStart;
public StarHandler(Star realStart) {
this.realStart = realStart;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 返回的数据
Object obj = null;
System.out.println("真正的方法执行前,面谈,签合同,预付款,订机票");
if (method.getName().equals("sing")) {
obj=method.invoke(realStart, args);
}
System.out.println("真正方法执行后,收尾款");
return obj;
}
}
调用
package com.xiaoqiang.gof23.structureModel.proxy.dynamicProxy;
import java.lang.reflect.Proxy;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.bookTicket();
proxy.sing();
}
}