位置: 编程技术 - 正文

深入理解JavaScript系列(37):设计模式之享元模式详解(深入理解javascript特性)

编辑:rootadmin

推荐整理分享深入理解JavaScript系列(37):设计模式之享元模式详解(深入理解javascript特性),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解ffmpeg pdf,深入理解计算机系统,深入理解计算机系统,深入理解新发展理念,推进供给侧结构性改革,深入理解javascript特性,深入理解javascript,深入理解javascript,深入理解javascript,内容如对您有帮助,希望把文章链接给更多的朋友!

介绍

享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生产大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数以外,开销基本相同的 话,就可以大幅度较少需要实例化的类的数量。如果能把那些参数移动到类实例的外面,在方法调用的时候将他们传递进来,就可以通过共享大幅度第减少单个实例 的数目。

那么如果在JavaScript中应用享元模式呢?有两种方式,第一种是应用在数据层上,主要是应用在内存里大量相似的对象上;第二种是应用在DOM层上,享元可以用在中央事件管理器上用来避免给父容器里的每个子元素都附加事件句柄。

享元与数据层

Flyweight中有两个重要概念--内部状态intrinsic和外部状态extrinsic之分,内部状态就是在对象里通过内部方法管理,而外部信息可以在通过外部删除或者保存。

说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式,Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象。

使用享元模式

让我们来演示一下如果通过一个类库让系统来管理所有的书籍,每个书籍的元数据暂定为如下内容:我们还需要定义每本书被借出去的时间和借书人,以及退书日期和是否可用状态:因为book对象设置成如下代码,注意该代码还未被优化:程序刚开始可能没问题,但是随着时间的增加,图书可能大批量增加,并且每种图书都有不同的版本和数量,你将会发现系统变得越来越慢。几千个book对象在内存里可想而知,我们需要用享元模式来优化。

我们可以将数据分成内部和外部两种数据,和book对象相关的数据(title, author 等)可以归结为内部属性,而(checkoutMember, dueReturnDate等)可以归结为外部属性。这样,如下代码就可以在同一本书里共享同一个对象了,因为不管谁借的书,只要书是同一本书,基本信息是一样的:

定义基本工厂

深入理解JavaScript系列(37):设计模式之享元模式详解(深入理解javascript特性)

让我们来定义一个基本工厂,用来检查之前是否创建该book的对象,如果有就返回,没有就重新创建并存储以便后面可以继续访问,这确保我们为每一种书只创建一个对象:管理外部状态外部状态,相对就简单了,除了我们封装好的book,其它都需要在这里管理:通过这种方式,我们做到了将同一种图书的相同信息保存在一个bookmanager对象里,而且只保存一份;相比之前的代码,就可以发现节约了很多内存。

享元模式与DOM

关于DOM的事件冒泡,在这里就不多说了,相信大家都已经知道了,我们举两个例子。

例1:事件集中管理

举例来说,如果我们又很多相似类型的元素或者结构(比如菜单,或者ul里的多个li)都需要监控他的click事件的话,那就需要多每个元素进行事件绑定,如果元素有非常非常多,那性能就可想而知了,而结合冒泡的知识,任何一个子元素有事件触发的话,那触发以后事件将冒泡到上一级元素,所以利用这个特性,我们可以使用享元模式,我们可以对这些相似元素的父级元素进行事件监控,然后再判断里面哪个子元素有事件触发了,再进行进一步的操作。

在这里我们结合一下jQuery的bind/unbind方法来举例。

HTML:JavaScript:

例2:应用享元模式提升性能

另外一个例子,依然和jQuery有关,一般我们在事件的回调函数里使用元素对象是会后,经常会用到$(this)这种形式,其实它重复创建了新对象,因为本身回调函数里的this已经是DOM元素自身了,我们必要必要使用如下这样的代码:其实,如果非要用$(this)这样的形式,我们也可以实现自己版本的单实例模式,比如我们来实现一个jQuery.signle(this)这样的函数以便返回DOM元素自身:使用方法:这样,就是原样返回DOM元素自身了,而且不进行jQuery对象的创建。

总结

Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中。

如果一个应用程序使用了大量的对象,而这些大量的对象造成了很大的存储开心时就应该考虑使用享元模式;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么就可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

深入理解JavaScript系列():设计模式之中介者模式详解 介绍中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改

深入理解JavaScript系列():设计模式之单例模式详解 介绍从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现。OK,正式开始。

深入理解JavaScript系列():设计模式之外观模式详解 介绍外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用。正文外观

标签: 深入理解javascript特性

本文链接地址:https://www.jiuchutong.com/biancheng/382858.html 转载请保留说明!

上一篇:浅谈JavaScript数据类型(javascript中数组的方法)

下一篇:深入理解JavaScript系列(36):设计模式之中介者模式详解(深入理解linux内核第三版)

  • 进项留抵转出会计分录
  • 一般纳税人和小规模纳税人交税区别
  • 自查补交以前年度增值税怎么做账
  • 汽车加油增值税发票
  • 对方发票丢了能报销吗
  • 进项税为什么记在借方通俗讲法
  • 购买汽车的保健因素
  • 小规模纳税人生活服务业免征增值税
  • 调整应付账款折扣到营业外收入吗
  • 餐饮通用机打发票可以报销吗
  • 票据贴现利息费用计入
  • 零售行业会计核算方法
  • 收客户逾期利息账务处理怎么做?
  • 应收账款入账金额的确定方法
  • 材料采购发生的合理损耗计入
  • 代收电费可以开发票吗
  • 含税和不含税哪个对卖方有利
  • 机械设备增值税税率
  • 企业2015年申报抵扣的增值税,2016年检查有11000元不得抵扣,需要补交增值税11000元并收滞纳金及罚款1200元,请问老师具体该怎么做账,谢谢
  • 安装属于劳务报酬吗
  • 无人机开票税收编码是多少
  • 资产类科目包括哪些内容
  • 预缴和实际应付的区别
  • 统计机构收到公开申请()内予以答复
  • 企业所得税弥补
  • 实发工资需扣除所得税吗
  • 应交增值税未认证怎么办
  • 小规模通行费发票可以抵扣吗
  • 股东变更需要提交的资料
  • 待摊费用和预提费用的区别
  • 施工项目费用明细表模板
  • 魁北克位置地图
  • 苹果手机nfc录门禁卡
  • 房屋权属转移是什么意思
  • 不确认收入要结转成本吗
  • 外购商誉是资产吗
  • 生产性生物资产折旧计入什么科目
  • vue父子组件传值
  • 应收应付对冲的会计分录
  • 融资租出固定资产计入什么科目
  • 预收账款转收入可以调以前年度吗
  • 纳税收入包括居民个人在境外取得的收入吗?
  • 四联发票都需要盖章吗
  • 增值税一般纳税人企业对同属于增值税
  • Mysql存储过程中的如何遍历一个查询结果集
  • 财务软件期末处理
  • 代数分配法的优缺点和适用范围
  • 利润表中的利息费用是利息支出吗
  • 应收账款在贷方为负数表示什么
  • 建筑安装增值税税率变更过程
  • 非税收入一般缴款书是什么意思
  • 收到政府补贴如何做帐
  • 商业劳务费是什么意思
  • 一般纳税人纳税申报表
  • 疫情期间购买消毒弥雾机的请示
  • 费用报销单怎么写 样本图片
  • 会计账簿按外表形式分
  • sql server 3417错误
  • MySQL5.6下windows msi安装详细介绍
  • solaris date命令
  • centos 安装
  • netsh cmd
  • 电脑周边是什么
  • win10专业版系统多少g
  • windows7的word
  • cocos2d drawcall
  • Windows下的写字板功能是
  • jQuery Validate 数组 全部验证问题
  • awk实例
  • vbs编辑
  • 如何执行perl脚本
  • opengl超级宝典pdf
  • vue.js如何使用
  • 美国买房hoa
  • 海关进口增值税如何入账
  • 江苏税务个人所得税app怎么下载不了?
  • 美国海关税收起征点
  • 浅谈新时代劳动教育答案
  • 个税系统崩溃
  • 安徽农村户口可以交社保吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设