Design Patterns Talk - Proxy Pattern

《大话设计模式》第 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()

应用场景

  1. 远程代理,为一个对象在不同地址空间提供局部代理,这样可以隐藏一个对象存在于不同地址空间的事实。
  2. 虚拟代理,通过它存放实例化需要很长时间的真实对象。
  3. 安全代理,用来控制真实对象访问时的权限。
  4. 智能指引,当调用真实对象时,代理处理另外一些事。

playground

你可能感兴趣的:(Design Patterns Talk - Proxy Pattern)