代理、委托、钩子与打桩
代理、委托、钩子与打桩
- 代理
- 委托
- 钩子
- 广义的钩子
- 打桩
代理
代理(proxy)指的是在需要使用某个事物时,使用另一个事物来代替原本需要的该事物。具体来说,若原本需要某个类的方法,而现在创建了该类的一个代理类,那么就可以在原本需要使用该类的地方,使用该类的代理类来替换。
一般意义下的代理的使用场景有很多,比方说,可以在原来类的基础上实现更复杂的功能。具体来说,如果需要某个类 A 的方法 a。可以定义类 A 的代理类 AProxy,并在其同名方法 a 中调用原来类 A 的方法 a,这样一来,代理类 AProxy 的同名方法 a 不仅拥有原来类 A 的方法 a 的功能,还可以在其基础上增加其它功能。
委托
委托(delegate)指的是一个类在定义的时候就表示自己只是提供相关的实现,把运行自身代码这项活动交给其它类来完成。
委托和代理的联系很紧密,但侧重点不同。委托类相当于代理中的被代理类(就是上面代理中提到的“原来类”),被委托类相当于代理中的代理类。但代理中的被代理类在设计的时候并不一定要声明自己以后会被代理,实际上,被代理类在设计的时候并不知道自己以后会被代理。代理只是强调对代理类的实现,而不是对被代理类的实现。同理,在委托中,侧重点是实现委托类,至于被委托类应该怎么设计,这不是委托应该主要考虑的事情。
委托类的设计是为了遵守设计模式中的单一职责原则,将一个活动的定义与使用分离。
钩子
钩子(hook)指的是一个程序预设的子程序跳转入口。在不同的编程语言、不同场景下,钩子可以指预先约定的某一类函数名、某个类的接口引用字段等等。
钩子在生活中指的是可以钩住其它东西的一种工具,只要其它东西上有能被钩子钩住的圆环即可。如果我们要使用其它工具,可以先通过钩子来获取该工具,这只需要提前在该工具上安装一个圆环即可。在编程中,这里的圆环相当于一个约定的接口,只要自己编写的程序遵守了此约定的规范,就可以在含钩子的程序在调用该程序。
钩子和代理也有些渊源。在某种角度上,含钩子的类也可以看成是一个代理类。但钩子和代理的区别在于,它们设计思路(流程)正好相反。对于代理,一般来说,被代理的类是很早以前就已经设计好了,而代理类依赖于被代理的类且设计时间晚于被代理类。但对于钩子,含钩子的程序往往是提交已经设计好了,之后只需要在使用该程序之前,将“圆环程序”提供该“钩子程序”,就可以使用该“钩子程序”了。可以看出,虽然“钩子程序”是依赖“圆环程序”的,但“圆环程序”的设计时间与“钩子程序”相对独立,是可以晚于“钩子程序”的。另外,“钩子”并未严格限定“圆环程序”的内容,“圆环程序”只需要遵守某种约定的规范,其内容可以自由发挥。这类似于 IoC 思想。如果硬要把代理中的概念与钩子相对应,那么从这个角度上,代理与钩子的区别在于,对于代理,可以自由发挥的是代理类,而对于钩子,则是被代理类。
广义的钩子
广义的钩子指的是一个可以控制程序流程的一段代码。但这段代码与程序其它部分的代码属于低耦合,即可以通过不改动其它部分的代码的条件下,任意地更改这段代码来控制程序的走向。
因此,广义的钩子不仅包括上面介绍的钩子,还包括一些类中预设的布尔函数,比方说,可以对某一系列的类中都设置一个布尔函数,然后用该布尔函数的返回值来决定程序走向,则该布尔函数就是一个广义的钩子。
打桩
在编程中,桩(stub)是指用于模拟真实环境的代码段。在开发者测试中,常常需要模拟真实的环境来用于测试。因为构建真实的环境往往成本很大或者不可能,这就需要模拟。在开发者测试中,一个大型的项目必须要分解成各个基本的单元,先进行单元测试(UT),然后进行集成测试(IT),最后进行系统测试(ST)。分开测试的各个部分的碎片化的模拟环境称为桩。桩一般就具体为,对真实环境进行模拟所编写的函数。对桩函数的编写称为打桩。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
