一:什么是代理模式?
代理模式本质上就是控制对象的访问。为其他对象提供一种代理以控制这个对象的访问。什么意思呢?
比如,有一个对象载入需要很长的时间,那么你可以不立刻加载它,而是当真正需要的时候才去加载。
二:静态代理(以汽车销售代理为例)
结构图:
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 保护代理: 即控制原始对象访问的代理
扫描二维码关注公众号,回复:
557175 查看本文章
我们现在假设,控制汽车售价的权限只有生产厂家才具备。其他对象是不能控制这个价格的。
//.......
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){ //在需要的时候才初始化主题对象 } }