代理、委托、打桩的区别

代理

  代理(proxy):被代理类写好一套 API 的实现对外开放使用,代理类在被代理类的 API 的基础上再封装一层,形成一套与被代理类接口不变的新 API 对外开放使用。

  在 C/S 架构中,代理还可分为正向代理与反向代理。关于这方面的内容,可见笔者的另一篇博客:

  正向代理与反向代理:
https://blog.csdn.net/wangpaiblog/article/details/115451987

委托

  委托(delegate):委托类事先写好一段程序,但自己不会主动调用自己的代码,而把自己传递给其它类,让其它类来调用自己。在有一些语言中,委托以闭包的形式出现。


  关于什么是闭包,可见笔者的另一篇博客:

  什么是闭包:
https://blog.csdn.net/wangpaiblog/article/details/113360870


  下面的 Groovy 代码演示了什么是委托。

class ProjectVersion {
    Integer major
    Integer minor;

    void increment(Closure closure) {
        closure.resolveStrategy = Closure.DELEGATE_ONLY
        closure.delegate = this;
        closure()
    }
}

ProjectVersion projectVersion = new ProjectVersion(major: 1, minor: 10)
projectVersion.increment { major += 1 }
assert projectVersion.major == 2
projectVersion.increment { minor += 5 }
assert projectVersion.minor == 15

  在上面的代码中,传递给方法 increment 的闭包就是一个委托,而方法 increment 就是一个被委托的方法,负责调用传入的委托。值得注意的是,局部变量 major、minor 实际上并没有在委托闭包中定义,但它为什么可以使用呢?因为它知道这些变量会在被委托类中定义,所以它可以直接使用。可以看出,委托与委托调用方是一种高内聚、互相依赖的关系。

  委托类的设计是为了遵守设计模式中的单一职责原则,将一个活动的定义与使用分离。

委托与代理的区别

  委托与代理非常相似,它们相似之处在于,委托类类似于被代理类,代理类类似委托调用方。但它们在设计上有些许的区别。

  在代理模式中,被代理类先出现,代理类后出现。被代理类在设计的时候不考虑自已以后会不会被代理。代理类低耦合依赖被代理类,但被代理类自身完全不需要代理类,它不在乎以后是否被代理。

  在委托模式中,委托与委托调用方的出现先后顺序可以任意。委托知道委托调用方以后会出现。委托与委托调用方是一种高内聚、互相依赖的关系,它们双方不能缺少另外一方。

  代理在被使用时,使用方无法区分代理类与被代理类,原因是它们的接口相同。委托与委托调用方的接口可以完全无关,而且委托可以在用户使用委托调用方时才提供。

打桩

  在编程中,桩(stub)是指用于模拟真实环境的代码段。在开发者测试中,常常需要模拟真实的环境来用于测试。因为构建真实的环境往往成本很大或者不可能,这就需要模拟。在开发者测试中,一个大型的项目必须要分解成各个基本的单元,先进行单元测试(UT),然后进行集成测试(IT),最后进行系统测试(ST)。分开测试的各个部分的碎片化的模拟环境称为桩。桩一般就具体为,对真实环境进行模拟所编写的函数。对桩函数的编写称为打桩。

打桩与代理的区别

  代理和打桩都有一种伪装、等效替代的思想。桩函数相当于代理类,都喜欢对外伪装成使用者原来想要使用的东西。但区别在于打桩是测试领域使用的术语,而代理是开发领域使用的术语。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值