美文网首页
Design Patterns Talk - Proxy Pat

Design Patterns Talk - Proxy Pat

作者: su3 | 来源:发表于2017-04-06 21:58 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/mqccattx.html