1.代理模式定义
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
代理模式这种设计模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。
代理模式的元素是:共同接口、代理对象、目标对象。
代理模式的行为:由代理对象执行目标对象的方法、由代理对象扩展目标对象的方法。
代理模式的宏观特性:对客户端只暴露出接口,不暴露它以下的架构。
代理模式的类图,如下:
代理模式的种类:静态代理、动态代理(jdk动态代理、Spring实现的动态代理)。
静态代理
这里举一个孙悟空,高翠兰和猪八戒的例子,首先把高翠兰的外观抽象出来,代码如下:
//高翠兰的外观
public interface Appearance {
public void head(); //头部
public void body(); //身体
}
现在让真实的高翠兰和假的高翠兰(孙悟空)去实现这个接口,代码如下:
//真是的高翠兰
public class RealGao implements Appearance{
@Override
public void head() {
System.out.println("高翠兰头部面貌");
}
@Override
public void body() {
System.out.println("高翠兰身体外观");
}
}
//代理的高翠兰,孙悟空代理
public class ProxySun implements Appearance{
private Appearance appear;
public ProxySun(Appearance appearance){ //传进来真实的高翠兰外观
super();
this.appear = appearance;
}
@Override
public void head() { //孙悟空代理的头部
appear.head();
}
@Override
public void body() {//孙悟空代理的身体外观
appear.body();
}
}
在代理类中可以看到,通过有参的构造方法传进来真实的高翠兰类,然后给代理的孙悟空类进行赋值。这样实现静态代理;测试类如下:
public class ProxyTest {
public static void main(String[] args) {
//猪八戒来看到的是。。。。。
Appearance real = new RealGao();
Appearance proxy = new ProxySun(real);
proxy.head();
proxy.body();
}
}
高翠兰头部面貌
高翠兰身体外观
可以看出,猪八戒只能跟代理对象打交道了。
动态代理
动态代理比静态代理使用的更广泛,动态代理在本质上,代理类不用我们来管,我们完全交给工具去生成代理类。下面来定义一下代理类,使用动态代理需要实现InvocationHandler接口,并覆写里面的invoke方法,真实的对象不变。如下:
public class DynamicProxy implements InvocationHandler{
private Appearance appear;
public DynamicProxy(Appearance appearance){
super();
this.appear = appearance;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object = null;
object = method.invoke(appear, args);
return object;
}
}
通过上述的代码可以看出,动态代理和静态代理思路是一样的,也是通过有参的构造方法将真实的高翠兰外观传进来,然后通过执行代理的invoke方法来代理。最后看一下测试代码:
public class ProxyTest {
public static void main(String[] args) {
//猪八戒来看到的是。。。。。
Appearance real = new RealGao();
DynamicProxy ap = new DynamicProxy(real);
Appearance proxy = (Appearance) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Appearance.class}, ap);
proxy.head();
proxy.body();
}
}
2.代理模式的优点和缺点
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。