代理模式(Proxy)

:什么是代理模式?

代理模式本质上就是控制对象的访问。为其他对象提供一种代理以控制这个对象的访问。什么意思呢?

比如,有一个对象载入需要很长的时间,那么你可以不立刻加载它,而是当真正需要的时候才去加载。

二:静态代理(以汽车销售代理为例)

结构图:



 

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){
			//在需要的时候才初始化主题对象
		}
	}

猜你喜欢

转载自nicky19870612.iteye.com/blog/2017839