代理模式
定义 : 为其他对象提供一种代理以控制对这个对象的访问。
代理模式的使用场景
当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证
客户端使用的透明性,委托对象与代理对象需要实现相同的接口。
静态代理
来看一组例子 小明现在想买一辆车但是车的种类太多了小明对车也不是很了解 所以小明打算找个代理去买车。
//买车的接口
public interface IBuyCar {
/**
* 找车
*/
void find();
/**
* 向4s店提交买车的想法
*/
void submit();
/**
* 付钱
*/
void pay();
/**
* 开回家
*/
void drive();
}
//小明
public class CifzBuyCar implements IBuyCar {
@Override
public void find() {
// TODO Auto-generated method stub
System.out.println("我要买车,先去转转找车");
}
@Override
public void submit() {
// TODO Auto-generated method stub
System.out.println("看好了找服务员说");
}
@Override
public void pay() {
// TODO Auto-generated method stub
System.out.println("开始付钱");
}
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("付了钱,开回家");
}
}
//代理人 持有一个具体被代理者的引用
public class CarProxy implements IBuyCar {
private IBuyCar iBuyCar;
/**
* @param iBuyCar
*/
public CarProxy(IBuyCar iBuyCar) {
super();
this.iBuyCar = iBuyCar;
}
@Override
public void find() {
// TODO Auto-generated method stub
iBuyCar.find();
}
@Override
public void submit() {
// TODO Auto-generated method stub
iBuyCar.submit();
}
@Override
public void pay() {
// TODO Auto-generated method stub
iBuyCar.pay();
}
@Override
public void drive() {
// TODO Auto-generated method stub
iBuyCar.drive();
}
}
//客户端
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//构造一个买车的人
IBuyCar cifz = new CifzBuyCar();
CarProxy proxy = new CarProxy(cifz);
proxy.find();
proxy.submit();
proxy.pay();
proxy.drive();
}
}
现在买车的代理流程就清晰了 但是现在有个问题 就是可以代理其他人吗?答案是可以 只需要在定义一个
小红什么的 实现IBuyCar接口
上述的代码其实静态代理 代理者的代码有程序员自己或通过一些自动化工具生成固定的代码 再对其进行编译,也就是说
在我们的代码运行前代理类的class编译文件就已经存在。
而动态代理则与静态代理相反,通过反射机制动态的生成代理者的对象,也就是说我们在code阶段压根就不需要知道代理水,代理
谁我们将会在执行阶段决定。而java也给我们提供了一个便捷的动态代理接口InvocationHandler。
我们下面看一下动态代理该怎么写 还是以买车为例
//动态代理类
/**
* 动态代理类
*/
public class DynamicProxy implements InvocationHandler {
private Object obj;
/**
* @param obj
*/
public DynamicProxy(Object obj) {
super();
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result = method.invoke(obj, args);
return result;
}
}
//修改后的客户端
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//构造一个买车的人
IBuyCar cifz = new CifzBuyCar();
DynamicProxy proxy = new DynamicProxy(cifz);
/**
* 获取被代理类 cifz的classloader
*/
ClassLoader loader = cifz.getClass().getClassLoader();
/**
* 动态构造一个代理买车者
*/
IBuyCar iBuyCar = (IBuyCar) Proxy.newProxyInstance(loader, new Class[] {IBuyCar.class}, proxy);
iBuyCar.find();
iBuyCar.submit();
iBuyCar.pay();
iBuyCar.drive();
}
}
运行结果和以前的是一致的