设计模式-延迟加载(Lazy Load)

概念

一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。

加载一个对象会引起大量相关对象的加载,这样会损害系统的性能。延迟加载会暂时终止这个加载过程。

运行机制

四种实现延迟加载的方法:

  • 延迟初始化(Lazy initialization)。每次访问属性域都要先检查该域是否为空,如果为空,计算并返回这个域值。适用于活动记录、表数据入口和行数据入口模式。
  • 虚代理(virtual proxy)。既然是延迟加载,必然需要一个附加的间接层,虚代理是一个虚对象,只有当其中一个方法被调用时,才从数据库加载适当的对象。
  • 值保持器(value holder)。用来包装某个其他对象的对象,只有第一次访问值保持器时它真正从数据库读取数据。缺点:类需要知道它的存在。
  • 重影(ghost)。是部分状态下的真实对象。当从数据库加载对象时,只包含ID,每次要访问某个域时,会加载其完全状态。
     

一些讨论

延迟加载适合于面向方面的程序设计,置于一个单独的方面,可以独立改变延迟加载策略。
为不同的用例配备不同的延迟加载策略,往往能够使二者配合的很好。例如,如果使用数据映射器,就可以需要两个订单映射器对象,一个直接加载订单项,另一个对象延迟加载这些项。
使用相同的基本加载方法,使用不同的策略对象决定加载模式。

使用时机

  • 只有在域需要另外的数据库访问时才考虑使用延迟加载,对数据库同一记录的剩余部分实施延迟加载意义不大,即使其余部分的数据域很大。
  • 从性能角度看,实施延迟加载取决于什么时候想取回数据。对应同一个用户界面的一次交互时,一次取回所有数据最为理想。
  • 需要额外的调用,并且当使用主对象时,所调用的数据还没有用到的时候。
  • 使用延迟加载增加了编程的复杂程度,因此需要时才使用延迟加载。
     

示例-延迟初始化(java

示例-虚代理(java

示例目标:仅仅当供应商中的产品列表被首次访问时才生成一个产品list

实现思想:在数据映射器中先将延迟机制做预处理,为将来获取域list做准备

Step1 建立供应商虚列表类

Step2 需要一种机制,使得当虚列表实例化时,调用具体的生成列表代码(具体的产品列表加载方法)。

Step3 建立虚列表类

Step4映射器通过实例化具体的加载方法而不是虚加载方法,建立域列表

说明:setProducts方法的参数并不是List类型,虽不能直接使用,但可以由VirtualList类型中的方法返回,即VirtualList::source

总结:领域类不关心映射器如何进行延迟加载,延迟加载完全由虚代理自行维护。领域类通过虚代理建立域数据的触发时机是:虚代理中的getSource方法,进而触发ProductLoader中具体的load()方法。

示例-值保持器(java

示例说明:和虚代理模式相似,区别在于域list直接保存在值保持器中,List对象则由值保持器提供的方法返回,而虚代理保存在List类型依靠虚代理返回。

Step1 建立供应商值保持器类

Step2 需要一种机制,当访问值保持器时,需要向其传递相应代码。

Step3 映射器通过实例化具体的加载方法而不是虚加载方法,建立值保持器

说明:值保持器可以作为通用的延迟加载使用。

示例-使用重影(C#)

领域对象需要相应的映射器,为了避免直接调用依赖,需要合并注册表和分离接口

重影的加载序列:

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-cascader的lazyLoad属性是用来实现懒加载和动态获取数据的。通过设置lazyLoad属性,可以指定一个方法来加载数据源。方法中有两个参数,第一个参数是当前点击的节点,第二个参数是数据加载完成后的回调函数。在方法中可以根据不同的级别来决定加载哪个接口的数据。如果是最后一级,则可以结束加载并返回数据。在使用lazyLoad属性时,还需要注意绑定正确的this上下文,确保能够访问到相关的api方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [el-cascader级联选择器单选/多选根据接口懒加载动态获取数据](https://blog.csdn.net/weixin_45489658/article/details/115919447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [使用el-cascader时设置lazyLoad需要注意方法中this的作用域](https://blog.csdn.net/YISHENGYOUNI95/article/details/109080764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值