代理
代理(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)。分开测试的各个部分的碎片化的模拟环境称为桩。桩一般就具体为,对真实环境进行模拟所编写的函数。对桩函数的编写称为打桩。
打桩与代理的区别
代理和打桩都有一种伪装、等效替代的思想。桩函数相当于代理类,都喜欢对外伪装成使用者原来想要使用的东西。但区别在于打桩是测试领域使用的术语,而代理是开发领域使用的术语。