代理、委托、钩子与打桩
代理、委托、钩子与打桩
- 代理
- 委托
- 钩子
- 广义的钩子
- 打桩
代理
代理(proxy)指的是在需要使用某个事物时,使用另一个事物来代替原本需要的该事物。具体来说,若原本需要某个类的方法,而现在创建了该类的一个代理类,那么就可以在原本需要使用该类的地方,使用该类的代理类来替换。
一般意义下的代理的使用场景有很多,比方说,可以在原来类的基础上实现更复杂的功能。具体来说,如果需要某个类 A 的方法 a。可以定义类 A 的代理类 AProxy,并在其同名方法 a 中调用原来类 A 的方法 a,这样一来,代理类 AProxy 的同名方法 a 不仅拥有原来类 A 的方法 a 的功能,还可以在其基础上增加其它功能。
委托
委托(delegate)指的是一个类在定义的时候就表示自己只是提供相关的实现,把运行自身代码这项活动交给其它类来完成。
委托和代理的联系很紧密,但侧重点不同。委托类相当于代理中的被代理类(就是上面代理中提到的“原来类”),被委托类相当于代理中的代理类。但代理中的被代理类在设计的时候并不一定要声明自己以后会被代理,实际上,被代理类在设计的时候并不知道自己以后会被代理。代理只是强调对代理类的实现,而不是对被代理类的实现。同理,在委托中,侧重点是实现委托类,至于被委托类应该怎么设计,这不是委托应该主要考虑的事情。
委托类的设计是为了遵守设计模式中的单一职责原则,将一个活动的定义与使用分离。
钩子
钩子(hook)指的是一个程序预设的子程序跳转入口。在不同的编程语言、不同场景下,钩子可以指预先约定的某一类函数名、某个类的接口引用字段等等。
钩子在生活中指的是可以钩住其它东西的一种工具,只要其它东西上有能被钩子钩住的圆环即可。如果我们要使用其它工具,可以先通过钩子来获取该工具,这只需要提前在该工具上安装一个圆环即可。在编程中,这里的圆环相当于一个约定的接口,只要自己编写的程序遵守了此约定的规范,就可以在含钩子的程序在调用该程序。
钩子和代理也有些渊源。在某种角度上,含钩子的类也可以看成是一个代理类。但钩子和代理的区别在于,它们设计思路(流程)正好相反。对于代理,一般来说,被代理的类是很早以前就已经设计好了,而代理类依赖于被代理的类且设计时间晚于被代理类。但对于钩子,含钩子的程序往往是提交已经设计好了,之后只需要在使用该程序之前,将“圆环程序”提供该“钩子程序”,就可以使用该“钩子程序”了。可以看出,虽然“钩子程序”是依赖“圆环程序”的,但“圆环程序”的设计时间与“钩子程序”相对独立,是可以晚于“钩子程序”的。另外,“钩子”并未严格限定“圆环程序”的内容,“圆环程序”只需要遵守某种约定的规范,其内容可以自由发挥。这类似于 IoC 思想。如果硬要把代理中的概念与钩子相对应,那么从这个角度上,代理与钩子的区别在于,对于代理,可以自由发挥的是代理类,而对于钩子,则是被代理类。
广义的钩子
广义的钩子指的是一个可以控制程序流程的一段代码。但这段代码与程序其它部分的代码属于低耦合,即可以通过不改动其它部分的代码的条件下,任意地更改这段代码来控制程序的走向。
因此,广义的钩子不仅包括上面介绍的钩子,还包括一些类中预设的布尔函数,比方说,可以对某一系列的类中都设置一个布尔函数,然后用该布尔函数的返回值来决定程序走向,则该布尔函数就是一个广义的钩子。
打桩
在编程中,桩(stub)是指用于模拟真实环境的代码段。在开发者测试中,常常需要模拟真实的环境来用于测试。因为构建真实的环境往往成本很大或者不可能,这就需要模拟。在开发者测试中,一个大型的项目必须要分解成各个基本的单元,先进行单元测试(UT),然后进行集成测试(IT),最后进行系统测试(ST)。分开测试的各个部分的碎片化的模拟环境称为桩。桩一般就具体为,对真实环境进行模拟所编写的函数。对桩函数的编写称为打桩。
代理、委托、钩子与打桩相关推荐
- 7开启uasp协议_【环海解读】新版通关无纸化协议签约amp;报关代理委托发起和确认操作流程...
最近,小编经常收到咨询,作为进出口货物收发货人,如何使用新版通关无纸化协议签约系统和报关代理委托系统呢? 客官莫急,今日就为大家提供一份科普篇,让您顺利完成报关前准备工作.下面小编将对登录及操作步骤进 ...
- https访问报错404_电子口岸报关代理委托系统,出现“404”“503”报错怎么办?...
文/Emily最近,咱们0571-95198客服团队频频接到电话,问题主要集中在:我打开www.chinaport.gov.cn的网址,登陆中国电子口岸执法系统选择报关代理委托,出口收汇等模块出现&q ...
- UE4代理委托(代理,动态代理,单播,多播)
官方例子https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Delegates 创建基于官方第三人称模版C++工程,项 ...
- Kotlin-20.代理/委托属性(delegated properties)
官方文档: http://kotlinlang.org/docs/reference/delegated-properties.html 1.委托属性 一些常见的属性类型:懒加载属性(lazy pro ...
- 代理、委托、打桩的区别
文章目录 代理 委托 委托与代理的区别 打桩 打桩与代理的区别 代理 代理(proxy):被代理类写好一套 API 的实现对外开放使用,代理类在被代理类的 API 的基础上再封装一层,形成一套与被 ...
- JS 事件代理和事件委托
目录 事件委托的概念理解 为什么要用事件委托 事件委托的原理: 事件代理(委托)实现 总结: 事件委托的概念理解 为什么叫事件委托?它还有一个名字叫事件代理. JavaScript高级程序设计上讲:事 ...
- 装饰模式与代理模式的区别
http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是 ...
- C++模拟实现Objective-C协议和代理模式
Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...
- 装饰器模式和代理模式的区别
转载自 装饰器模式和代理模式的区别 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是找了很多资料,想弄清 ...
最新文章
- 0x13链表与邻接表之邻值查找
- 模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet
- 华为支持nfc功能的手机有哪些_四款带NFC功能的千元机,三星华为低至1399元!...
- 2017CCPC哈尔滨 D:X-Men
- 【基础知识】.Net基础加强 第四天
- ie浏览器在线使用_教师资格证报名使用的不是ie系列浏览器怎么办?
- arpa/inet.h中定义的函数
- Docker设置容器CPU、memory、磁盘IO资源限制
- ModBus RTU和ModBus ASC
- 七周成为数据分析师 第四周:数据可视化
- 51单片机 74LS138译码器流水灯+Proteus仿真
- Excel图表配色原理
- 人生顿悟之博观而约取,厚积而薄发
- 数学建模笔记-斜抛运动建模
- 南京大学计算机 曹云浩,【2015.青春曲园】第二十六届“迎校庆”校园十佳歌手大赛独家放送~...
- Java 操作excel
- C语言--闰年判断程序
- unity怪物攻击玩家减血_Unity3D 战斗系统中的怪物简单AI(简单AOI)
- js对手机号进行脱敏处理
热门文章
- Java Integer的缓存策略
- 将一个大文件分成若干个小文件方法
- 铜陵信息化建设和智慧城市发展成果惠及百姓
- (转) 淘淘商城系列——Redis五种数据类型介绍
- Java学习笔记二:数据类型
- H3C 基于IP的限速
- java调度:(四) spring中使用quartz的配置文件.
- 教你11 周打造全能Python工程师!
- 新疆自考大专计算机应用专业,新疆大学2017年新疆自考计算机信息管理(专科)考试计划...
- hdfs安全模式退出_浅谈HDFS(二)之NameNode与SecondaryNameNode