代理模式
为另一个对象提供一个替身或占位符以控制这个对象的访问。
代理模式有很多变体,而这些变体几乎都和控制访问的做法有关。proxy和realObj实现相同的接口,当调用proxy的某一个方法时,proxy作出某种控制,去调用真正的realObj,并将处理结果传给proxy,proxy将结果返回给调用者。这就是代理模式的基本逻辑。
远程代理
当我们想要调用远程的类的方法时,我们先调用本地代理,本地代理帮我们处理网络上的细节,去调用远程机器上的方法,并获取处理结果,本地代理再将处理结果返回给调用方。典型的是RMI远程方法调用。
虚拟代理
当我们想创建一个开销大的对象时,在真正的对象创建完毕前,都由虚拟代理来扮演该对象和请求方交互,一旦对象创建完毕,虚拟代理会将交互直接委托给该对象。比如对象未创建完成时,点击任何操作,都将显示,资源正在加载中。
保护代理
这是一种根据访问权限决定客户是否可以访问对象的一种代理。最典型的是动态代理技术,java内置Proxy类进行动态代理的创建。动态代理之所以被称为动态,是因为运行时才将它的类创建出来,而不是将对象创建出来。
与装饰者模式
装饰者模式是组合对象,并增强该对象的行为,甚至改变对象的行为。代理模式是组合对象,并控制对该对象的访问。前者增强,后者控制。
与适配器模式
适配器模式是将一个接口,转化为不同的接口。代理模式,是将一个接口,通过控制访问相同的接口。前者改变接口,后者控制接口。
总结
为什么要用代理类?不同的目的。
当你需要控制远程的类时,可以用代理类代替远程类,而代理类用来封装网络传输,调用真实类等操作,就好像客户端调用本地类一样调用远程类。
当客户端调用的真实类的初始化很耗资源的时候,在初始化的过程中,可以让代理类和客户端进行交流,不然客户端将因为等待而“卡死”。
当客户端调用真实类的行为需要受到限制的时候,代理类在调用真实类之前可以进行一些过滤,或调用真实类之后可以进行一些其他操作。
。。。
这样的好处是什么?客户端可以和真实类解耦,并能控制客户端对真实类的访问,不论是控制网络细节,还是控制真实类的初始化前给客户的反馈,还是控制真实类的访问权限。即使真实类发生了改变,控制发生改变,客户端也是无感知的,并不需要更改代码。
抽取变化部分:控制方式和真实类是可能改变的,因此抽取出来。这样客户端就不用发生改变。代理外面还可以加代理,这是一种有趣的扩展。