1.概述
因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身。即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
例子1:经典例子就是网络代理,你想访问facebook或者twitter ,如何绕过GFW,找个代理网站。
例子2:可以调用远程代理处理一些操作如图:
代理模式.png
代理接口
//代理接口
protocol GiveGift {
func giveDolls()
func giveFlowers()
func giveChocolate()
}
被代理类
//被代理人
class Pursuit: NSObject, GiveGift {
var girl: SchoolGirl?
init(mm: SchoolGirl) {
girl = mm
super.init()
}
func giveDolls() {
print("送布娃娃")
}
func giveFlowers() {
print("送花")
}
func giveChocolate() {
print("送巧克力")
}
}
代理类
//代理人,
class Proxy: NSObject, GiveGift {
//代理对象
var gg: Pursuit?
init(mm: SchoolGirl) {
gg = Pursuit(mm: mm)
}
func giveDolls() {
gg?.giveDolls()
}
func giveFlowers() {
gg?.giveFlowers()
}
func giveChocolate() {
gg?.giveChocolate()
}
}
被代理类要访问的对象类
//代理直接接触的对象
class SchoolGirl: NSObject {
var name: String?
init(name: String) {
self.name = name
}
}
用法
//代理承受人
let mm = SchoolGirl(name: "娇娇")
//代理(gg 被代理人内部自动创建一个默认值)
let daili = Proxy(mm: mm)
daili.giveDolls()
daili.giveFlowers()
daili.giveChocolate()
网友评论