《大话设计模式》第 7 章 - 代理模式 的 Swift 实现。
问题
“追求者”通过“代理”送礼物给“SchoolGirl”。
方案
为其他对象提供一种代理以控制对这个对象的访问。
1. Subject:定义 RealSubject 和 Proxy 的共同接口
protocol SendGift {
func sendDolls()
func sendFlowers()
func sendChocolate()
}
2. RealSubject 类:定义 Proxy 所代表的真实实体
实现接口所定义的方法。
class Pursuit: SendGift{
let mm: SchoolGirl
init(mm: SchoolGirl) {
self.mm = mm
}
func sendDolls() {
print("Send dolls to \(mm.name)")
}
func sendFlowers() {
print("Send flowers to \(mm.name)")
}
func sendChocolate() {
print("Send chocolate to \(mm.name)")
}
}
3. Proxy 类:保存一个引用使得代理可以访问实体,并实现 Subject 定义的接口,这样代理就可以替代实体
在实现中调用 pursuit 类相关的方法
class Proxy: SendGift{
var persuit: Pursuit
init(mm: SchoolGirl) {
self.persuit = Pursuit(mm:mm)
}
func sendDolls() {
persuit.sendDolls()
}
func sendFlowers() {
persuit.sendFlowers()
}
func sendChocolate() {
persuit.sendChocolate()
}
}
测试
let jane = SchoolGirl(name: "Jane")
let proxy = Proxy(mm: jane)
proxy.sendDolls()
proxy.sendFlowers()
proxy.sendChocolate()
应用场景
- 远程代理,为一个对象在不同地址空间提供局部代理,这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,通过它存放实例化需要很长时间的真实对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,当调用真实对象时,代理处理另外一些事。
网友评论