一:什么是代理模式?
代理模式本质上就是控制对象的访问。为其他对象提供一种代理以控制这个对象的访问。什么意思呢?
比如,有一个对象载入需要很长的时间,那么你可以不立刻加载它,而是当真正需要的时候才去加载。
二:静态代理(以汽车销售代理为例)
结构图:
package Proxy.staticProxy;
/**
* 宝马销售接口
* @author Administrator
*
*/
public interface IBMWSaler {
//有一个卖宝马车的方法
public abstract void saleBMWCar();
}
package Proxy.staticProxy;
/**
* 宝马生产厂家也可以卖宝马车
* @author Administrator
*
*/
public class BMWManufacturers implements IBMWSaler {
@Override
public void saleBMWCar() {
System.out.println("BMW Manufacturers Sale the Car! ");
}
}
package Proxy.staticProxy;
/**
* XYZ 代理商 卖宝马车
* @author Administrator
*/
public class XYZBMWProxy implements IBMWSaler {
//代理的是谁
private IBMWSaler BMWSaler;
public XYZBMWProxy(IBMWSaler BMWSaler){
this.BMWSaler = BMWSaler;
}
public void saleBMWCar() {
BMWSaler.saleBMWCar();
}
}
package Proxy.staticProxy;
public class Client {
public static void main(String[] args) {
//初始化一个生产厂家
IBMWSaler manufacturer = new BMWManufacturers();
//初始化一个代理商
IBMWSaler proxySaler = new XYZBMWProxy(manufacturer);
//代理商销售汽车
proxySaler.saleBMWCar();
}
}
2 保护代理: 即控制原始对象访问的代理
我们现在假设,控制汽车售价的权限只有生产厂家才具备。其他对象是不能控制这个价格的。
//.......
3 动态代理:主要体现在切面编程
结构图:
package Proxy.dynamicProxy;
public interface Subject {
void print();
}
package Proxy.dynamicProxy;
public class RealSubject implements Subject {
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("我是真实对象");
}
}
package Proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler{
//被代理的对象
private Object target;
//通过构造函数传递一个对象
public MyInvocationHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return method.invoke(this.target, args);
}
}
package Proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxy<T> {
public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,
InvocationHandler handler){
if(true){
new BeforeAdvice().execute();
}
//执行目标并返回结果
return (T)Proxy.newProxyInstance(loader, interfaces, handler);
}
}
package Proxy.dynamicProxy;
public interface IAdvice {
void execute();
}
package Proxy.dynamicProxy;
public class BeforeAdvice implements IAdvice {
@Override
public void execute() {
System.out.println("前置通知");
}
}
package Proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
public class Client {
public static void main(String[] args) {
//定义主题
Subject subject = new RealSubject();
//定义一个代理
InvocationHandler handler = new MyInvocationHandler(subject);
//定义主题的代理
Subject proxy = DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(),
subject.getClass().getInterfaces(), handler);
//代理的行为
proxy.print();
}
}
4 虚拟代理 其实就是在需要的时候才初始化
public void saleBMWCar() {
if(BMWSaler == null){
//在需要的时候才初始化主题对象
}
}