1.代理模式
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
举个例子来说明代理的作用:假设我们要交班费,学生张三呢不想自己去,就把钱给了组长Proxy,Proxy帮他交了,那么这个组长Proxy就是张三的代理,这就是代理思想在现实中的一个例子
用图表示如下
首先,我们创建一个Person接口。这个接口就是学生(被代理类),和组长(代理类)的公共接口,他们都有上交班费的行为。这样,学生上交班费就可以让组长来代理执行。
public interface Person {
//上交班费
void giveMoney();
}
public class Student implements Person{
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void giveMoney() {
System.out.println(name + "上交班费50元");
}
}
动态代理简单实现
在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。
创建一个动态代理对象步骤,具体代码见后面:
public class TraceHandler implements InvocationHandler {
private Object target;
public TraceHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理学生交班费");
Object obj=method.invoke(target);
return obj;
}
}
public class ProxyTest {
public static void main(String[] args) {
//创建一个实例对象,这个对象是被代理的对象
Person zhangsan = new Student("张三");
//创建一个与代理对象相关联的InvocationHandler
InvocationHandler stuHandler = new TraceHandler(zhangsan);
//创建一个代理对象stuProxy来代理zhangsan,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class<?>[]{Person.class},stuHandler);
//代理执行上交班费的方法
stuProxy.giveMoney();
}
}
运行结果:
代理学生交班费
张三上交班费50元