代理模式proxy
通过代理,控制对对象的访问。可以详细控制控制某个对象的方法,在这个方法前做前置处理,方法后做后置处理
场景
- 安全代理:屏蔽对真实角色的直接访问。
- 远程代理:通过代理类处理远程方法调用
- 延迟加载:先加载轻量级的代理对象,真正需要在加载真正对象
核心角色
- 真实角色,真正的业务逻辑
- 代理角色,将统一的流程放到代理角色中
- 抽象角色(定义真实角色和代理角色的公共对外方法)
静态代理实现
真实角色和代理角色实现相同的一个抽象角色接口
/**
* 真实对象
* @author Administrator
*
*/
public class Real implements SellingHouses {
@Override
public void publish() {
// TODO 自动生成的方法存根
//不需要真实对象处理
System.out.println("不需要真实对象处理");
}
@Override
public void lookHouses() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
@Override
public void signContract() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
@Override
public void receiveMoney() {
// TODO 自动生成的方法存根
System.out.println("真实对象收钱");
}
@Override
public void giveKey() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
}
/**
* 代理对象
* @author Administrator
*
*/
public class Proxy implements SellingHouses {
private Real real;
/**
*
*/
public Proxy() {
real=new Real();
}
public Proxy(Real real) {
super();
this.real = real;
}
@Override
public void publish() {
// TODO 自动生成的方法存根
System.out.println("中介发布");
}
@Override
public void lookHouses() {
// TODO 自动生成的方法存根
System.out.println("中介带领买家看房");
}
@Override
public void signContract() {
// TODO 自动生成的方法存根
System.out.println("中介与买家签合同");
}
@Override
public void receiveMoney() {
// TODO 自动生成的方法存根
real.receiveMoney();
}
@Override
public void giveKey() {
// TODO 自动生成的方法存根
System.out.println("中介把钥匙给买家");
}
}
/**
* 抽象对象中介代理卖房
* @author Administrator
*
*/
public interface SellingHouses {
/**
* 发布
*/
void publish();
/**
* 买家看房
*/
void lookHouses();
/**
* 签合同
*/
void signContract();
/**
* 收钱
*/
void receiveMoney();
/**
* 给钥匙
*/
void giveKey();
}
public class Client {
public static void main(String[] args) {
Proxy proxy=new Proxy();
proxy.publish();
proxy.lookHouses();
proxy.signContract();
proxy.receiveMoney();
proxy.giveKey();
}
}
动态代理(动态生成代理类)
- JDK自带的动态代理
- Javassist字节码操作库
- CGLIB
JDK自带的动态代理实现:
Java.lang.reflect.Proxy动态生成代理类和对象
Java.lang.reflect.InvocationHandler(处理器接口)通过invoke方法实现对真实对象的访问
每次通过Proxy生成代理对象时,都要指定对应的处理器(handler)对象
/**
* 抽象对象中介代理卖房
* @author Administrator
*
*/
public interface SellingHouses {
/**
* 发布
*/
void publish();
/**
* 买家看房
*/
void lookHouses();
/**
* 签合同
*/
void signContract();
/**
* 收钱
*/
void receiveMoney();
/**
* 给钥匙
*/
void giveKey();
}
/**
* 真实对象
* @author Administrator
*
*/
public class Real implements SellingHouses {
@Override
public void publish() {
// TODO 自动生成的方法存根
//不需要真实对象处理
System.out.println("不需要真实对象处理");
}
@Override
public void lookHouses() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
@Override
public void signContract() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
@Override
public void receiveMoney() {
// TODO 自动生成的方法存根
System.out.println("真实对象收钱");
}
@Override
public void giveKey() {
// TODO 自动生成的方法存根
System.out.println("不需要真实对象处理");
}
}
public class ProxyHandler implements InvocationHandler {
Real real;
public ProxyHandler(Real real) {
super();
this.real = real;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO 自动生成的方法存根
Object obj=null;
System.out.println("中介发布");
System.out.println("中介带领买家看房");
System.out.println("中介与买家签合同");
if(method.getName().equals("receiveMoney")) {
obj = method.invoke(real, args);
}
System.out.println("中介把钥匙给买家");
return obj;
}
}
public class Client {
public static void main(String[] args) {
ProxyHandler handler=new ProxyHandler(new Real());
SellingHouses proxy=(SellingHouses)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {SellingHouses.class}, handler);//动态生成代理类
proxy.receiveMoney();
}
}