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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 访问多条数据## 考虑这样一个实际应用:要一次性访问多条数据。 这个功能的背景是这样的;在...
    七寸知架构阅读 3,044评论 1 52
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 本篇文章继续介绍Java反射机制,不同的是侧重于介绍动态代理。动态代理是代理模式中的一种,是通过Java反射机制来...
    Android进阶与总结阅读 636评论 0 0
  • 做了一个梦 梦中有人给我指了一片树林外孤立的一棵小树苗 我只说:放心吧 便开始照顾起了那棵孤单的小柳树 我给它...
    ___indulgence__阅读 155评论 0 0
  • UBC开学季有很多新生活动,今天和闻韶第一次参加了中国学生会在海滩的BBQ聚会。烧烤味道一般,但是却认识了几位可爱...
    钟西贝阅读 807评论 2 51