在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
代理对象和真实对象都实现同一个接口类,真正工作的是真实对象
例子:
如果你想找个歌星出台唱歌,你不直接和歌星接触,而是先找到经纪人,即他的代理,沟通好了再请歌星。
创建实际工作的对象:
public interface Subject {
void doWork();
}
public class RealSubject implements Subject {
@Override
public void doWork() {
System.out.println("歌星唱歌");
}
}
创建代理
public class Proxy implements Subject {
private RealSubject realSubject;
@Override
public void doWork() {
if (realSubject == null) {
realSubject = new RealSubject();
}
System.out.println("与经济人谈判");
realSubject.doWork();
System.out.println("给经纪人钱");
}
}
执行:
public class ProxyMain {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.doWork();
}
}
输出:
与经济人谈判
歌星唱歌
给经纪人钱
a以上是静态代理:
现在可以看到,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。
上面介绍的是静态代理的内容,为什么叫做静态呢?因为它的类型是事先预定好的,比如上面代码中的 Cinema 这个类。下面要介绍的内容就是动态代理。
动态代理
- 实现InvocationHandler接口创建自己的调用处理器
- 给Proxy类提供ClassLoader和代理接口类型数组创建动态代理类
- 以调用处理器类型为参数,利用反射机制得到动态代理类的构造函数
- 以调用处理器对象为参数,利用动态代理类的构造函数创建动态代理类对象
区别
- 代理分为静态代理和动态代理两种。
- 静态代理,代理类需要自己编写代码写成。
动态代理,代理类通过 Proxy.newInstance() 方法生成。
- 不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。
- 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
- 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
- 代理模式本质上的目的是为了增强现有代码的功能。