定义
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
通过引入代理对象的方式来间接访问目标对象
- 例子:通过代理购买电脑
步骤1: 创建接口,暴露提供对外的能力
/**
*抽象对象接口,对外提供的能力
*/
interface ISubject {
//购买电脑
fun buyComputer()
}
步骤2:真实实业务现对象
/**
* 真实实业务现对象
*/
class RealSubject : ISubject {
override fun buyComputer() {
println("我去买电脑")
}
}
步骤3: 代理的实现对象
/**
* 代理的实现对象
*/
class ProxySubject : ISubject {
//创建真实的实现
private val realSubject = RealSubject()
override fun buyComputer() {
//调用真实的实现对象
realSubject.buyComputer()
//调用额外操作
wrapComputer()
}
//代理提供额外的操作
private fun wrapComputer() {
println("代理包装电脑")
}
}
步骤4 使用
fun main(args: Array<String>) {
//通过代理进行使用
val subject = ProxySubject()
subject.buyComputer()
}
输出结果:
image.png
优点
协调调用者和被调用者,降低了系统的耦合度
代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
缺点
由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。
应用场景
当需要为一个对象再不同的地址空间提供局部的代表时
此时的代理模式称为远程代理:为一个对象在不同的地址空间提供局部代表。
目的:
隐藏一个对象存在于不同地址空间的事实;
远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
当需要创建开销非常大的对象时
此时的代理模式称为虚拟代理:通过使用过一个小的对象代理一个大对象。
目的:减少系统的开销。
当需要控制对原始对象的访问时
此时的代理模式称为保护代理:控制目标对象的访问,给不同用户提供不同的访问权限
目的:用来控制对真实对象的访问权限
当需要在访问对象时附加额外操作时
此时的代理模式称为智能引用代理,额外操作包括耗时操作、计算访问次数等等
目的:在不影响对象类的情况下,在访问对象时进行更多的操作
网友评论