代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
抽象主题角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。 定义真实主题角色RealSubject 和代理角色Proxy共用的接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
代理角色(Proxy)::实现抽象主题角色,是真实主题角色的代理。代理角色对象内部含有对真实主题角色对象的引用,从而可以操作真实主题角色对象,同时代理角色对象提供与真实主题角色对象相同的接口以便在任何时刻都能代替真实主题角色对象。同时代理角色对象在执行真实主题角色对象操作时,可以附加其他的操作,相当于对真实主题角色对象进行封装。
真实主题角色(RealSubject):实现抽象主题角色,定义真实主题角色所要实现的业务逻辑,供代理角色调用。
代理模式分为静态代理、动态代理:
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。