代理模式UML类图
代理模式
1. 静态代理
/**
* 为被代理的类提供一个接口,是为了提高代理的通用性,凡是实现了该接口的类,都可以被代理
* 这里其实就是运用了java面向对象的多态性
*/
public interface IHello {
public void sayHello();
}
/**
* 被代理的类,最根本的想法就是想用另外一个类来代理这个类,给这个类添加一些额外的东西
* 我们只需要创建另外一个类引用这个类就行了
*/
public class Hello implements IHello
{
public void sayHello(){
System.out.println("被代理的方法");
}
}
/**
* 静态代理类,其实就是(被代理类的)接口的另外一种实现,
* 用来代替原来的被代理类
* @author qiuxy
*/
public class StaticProxy implements IHello {
IHello hello;
public StaticProxy(IHello hello) {
this.hello = hello;
}
/**
* 重新实现了sayHello()方法,这种实现其实就是在被代理类实现该方法中添加一些额外的东西, 以实现代理的作用
*/
public void sayHello() {
System.out.println("在被代理的对象之前执行");
// 被代理的对象执行方法
hello.sayHello();
System.out.println("在被代理的对象之前执行");
}
}
/**
* 测试类
* @author qiuxy
*/
public class Test {
public static void main(String[] args) {
//产生一个被代理对象,只要实现了Ihello接口的对象,都可以成为被代理对象
//这里就是利用接口的好处,但这个也有局限性,就是只限于某种接口
IHello hello = new Hello();
//产生一个代理对象
StaticProxy sp = new StaticProxy(hello);
//执行代理对象的sayHello()方法,这个方法在被代理的方法前后添加了其他代码
sp.sayHello();
}
}
2. 动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理处理器,这个代理处理器实现了InvocationHandler这个接口,
* 这个接口的提供了一个invoke方法,并且传入三个参数(被代理的对象,被代理的方法,方法的参数数组)
* 这个invoke方法会在被代理的方法之前被调用
*/
public class MyProxyHandler implements InvocationHandler {
//被代理的对象
Object delegate;
//构造函数,在构在这个代理处理器时,传入要被代理的对象
public MyProxyHandler(Object delegate) { this.delegate = delegate;
}
//被代理的方法之前会调用的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我在被代理的方法之前执行");
//被代理的方法开始执行
method.invoke(delegate, args);
System.out.println("我在被代理的方法之后执行");
return null;
}
}
import java.lang.reflect.Proxy;
/**
* 测试类
*/
public class Test
{
public static void main(String[] args)
{
Hello hello = new Hello();
//产生一个代理处理器对象
MyProxyHandler mph = new MyProxyHandler(hello);
//通过反射获得代理类,这里必须转换成代理类的接口类型
//这个代理对象其实是java动态生成一个被代理类的接口的另外一个实现类
IHello myProxy = (IHello)Proxy.newProxyInstance(hello.getClass().getClassLoader() , hello.getClass().getInterfaces(), mph);
//代理类执行方法
myProxy.sayHello();
}
}