1、代理模式
定义:提供一种方式来访问对象。由于目标对象不能访问或者需要增加额外的功能
比如说,来到陌生城市,想要找住的地方,在找不到直租的情况下,我们需要通过中介来帮我们找房子(北京的中介很坑的,也没有办法)。
2、使用场景
无法访问或者不能直接访问对象时,使用代理模式来控制对对象的访问。
UML图:
3、示例
1、找房子要做的工作
public interface FindHouse {
void findHouse();//找房子
void payHouse();//交房租
void leaveHouse();//退房子
}
2、找房子的人要做的具体工作
public class People implements FindHouse {
@Override
public void findHouse() {
System.out.println("找房子");
}
@Override
public void payHouse() {
System.out.println("交房租");
}
@Override
public void leaveHouse() {
System.out.println("退房子");
}
}
3、委托代理
public class ProxyHouse implements FindHouse {
private People people;
public ProxyHouse(People people) {
this.people = people;
}
@Override
public void findHouse() {
people.findHouse();
}
@Override
public void payHouse() {
people.payHouse();
}
@Override
public void leaveHouse() {
people.leaveHouse();
}
}
4、测试
public class TestProxy {
public static void main(String[] args){
//找房子
FindHouse findHouse=new People();
//委托代理
FindHouse proxyHouse=new ProxyHouse((People) findHouse);
proxyHouse.findHouse();
proxyHouse.payHouse();
proxyHouse.leaveHouse();
}
}
运行结果:
找房子
交房租
退房子
上面这个例子很容易明白,这是静态代理。
4、代理的分类
1、静态代理:对象和代理的对象实现相同的接口或者父类。
2、动态代理:代理的对象不需要实现接口或者继承父类。而且上动态的生成。
还以上面为例:
创建动态代理对象:
public class DynamicProxy implements InvocationHandler {
//引入被代理的对象
private Object obj;
public DynamicProxy(Object object){
this.obj=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object=method.invoke(obj,args);
return object;
}
}
测试
//动态代理示例:
FindHouse findHouse=new People();
DynamicProxy dynamicProxy=new DynamicProxy(findHouse);
ClassLoader classLoader=findHouse.getClass().getClassLoader();
FindHouse proxy= (FindHouse) Proxy.newProxyInstance(classLoader,new Class[] {FindHouse.class},dynamicProxy);
proxy.findHouse();
proxy.payHouse();
proxy.leaveHouse();
运行结果是一样的
动态代理:动态代理是在程序运行的时候,通过反射,来动态的获取对象,并且创建代理
Ref 《Android源码设计模式解析与实战》