定义
为其他对象提供一种代理,以控制对这个对象的访问;
结构UML
代理模式结构图
整个的代理模式,有面向接口编程的雏形,下面通过代码,对UML图进行解析:
interface Subject {
fun request()
}
Subject是一个接口,该接口定义了request方法。
class RealSubject : Subject {
override fun request() {
// do sth.
}
}
RealSubject继承了Subject接口,实现其中的方法。
class Proxy : Subject {
val realSubject: RealSubject = RealSubject()
override fun request() {
realSubject.request()
}
}
代理也继承了Subject接口,实现其中方法,同时,还持有一个RealSubject的实例,实现的方法实质就是调用RealSubject中的对应方法。
class Client {
fun startRequest() {
val proxy: Proxy = Proxy()
proxy.request()
}
}
调用时,用户只和代理Proxy进行交互,不必知晓真实操作的对象。
应用实例
王小辉想租房子,但是房主身份神秘,从来没有露面过,而是委托自己的律师与王小辉签订合同。在这之中神秘房主的律师就起到了代理的作用。
interface IRentHouse {
fun viewHouse()
fun payInAdvance()
fun signContract()
}
此时,有一个租房的接口,IRentHouse。
class Landlord : IRentHouse {
override fun viewHouse() {
// 掏出房子钥匙
}
override fun payInAdvance() {
// 收定金
}
override fun signContract() {
// 签合同
}
}
房东Landlord实现了这个接口,具备看房、收定金和签合同的具体功能。
class Proxy : IRentHouse {
val landlorder: Landlord = Landlord()
override fun viewHouse() {
landlorder.viewHouse()
}
override fun payInAdvance() {
landlorder.payInAdvance()
}
override fun signContract() {
landlorder.signContract()
}
}
房主的律师,起到了代理的作用,代理房主完成看房、收钱和签合同的功能。
class WangXiaoHui {
fun startRequest() {
val proxy: Proxy = Proxy()
proxy.viewHouse()
proxy.payInAdvance()
proxy.signContract()
}
}
王小辉只和律师(代理)进行交互,就能完成租房的全部流程,很好的隐藏了房主的信息。
总结
代理模式四中分类
1、远程代理
为一个对象,在不同的地址空间提供局部代理,可以隐藏一个对象存在于不同地址空间的事实。比如WebService,由WebReference进行隐藏代理。
2、虚拟代理
根据需求创建开销很大的对象,通过它来存放实例化需要很长时间的真是对象,提升性能。比如打开很大的网页,先看到文字,随后图片才一张张加载出来,未显示的图片框,就是虚拟代理,代替了真实的图片。
3、安全代理
用来控制真实对象的访问权限。
4、智能指引
调用真实对象的方法的同时,代理可以处理其他事务。