位置: 编程技术 - 正文

总结JavaScript设计模式编程中的享元模式使用(js常用的设计模式)

编辑:rootadmin

推荐整理分享总结JavaScript设计模式编程中的享元模式使用(js常用的设计模式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascriptz,javascript在哪设置,javascript怎么设置,javascript设计的初衷和特点,javascriptide,javascript在哪设置,javascript在哪设置,javascript设计的初衷和特点,内容如对您有帮助,希望把文章链接给更多的朋友!

享元模式不同于一般的设计模式,它主要用来优化程序的性能,它最适合解决大量类似的对象而产生的性能问题。享元模式通过分析应用程序的对象,将其解析为内在数据和外在数据,减少对象的数量,从而提高应用程序的性能。

基本知识

享元模式通过共享大量的细粒度的对象,减少对象的数量,从而减少对象的内存,提高应用程序的性能。其基本思想就是分解现有类似对象的组成,将其展开为可以共享的内在数据和不可共享的外在数据,我们称内在数据的对象为享元对象。通常还需要一个工厂类来维护内在数据。在JS中,享元模式主要有下面几个角色组成:(1)客户端:用来调用享元工厂来获取内在数据的类,通常是应用程序所需的对象,(2)享元工厂:用来维护享元数据的类(3)享元类:保持内在数据的类

享元模式的实现和应用

一般实现

我们举个例子进行说明:苹果公司批量生产iphone,iphone的大部分数据比如型号,屏幕都是一样,少数部分数据比如内存有分G,G等。未使用享元模式前,我们写代码如下:

这段代码中,创建了一百万个iphone,每个iphone都独立申请一个内存。但是我们仔细观察可以看到,大部分iphone都是类似的,只是内存和序列号不一样,如果是一个对性能要求比较高的程序,我们就要考虑去优化它。大量相似对象的程序,我们就可以考虑用享元模式去优化它,我们分析出大部分的iphone的型号,屏幕,内存都是一样的,那这部分数据就可以公用,就是享元模式中的内在数据,定义享元类如下:

我们定义了iphone的享元类,其中包含型号,屏幕和内存三个数据。我们还需要一个享元工厂来维护这些数据:

在这个工厂中,我们定义了一个字典来保存享元对象,提供一个方法根据参数来获取享元对象,如果字典中有则直接返回,没有则创建一个返回。接着我们创建一个客户端类,这个客户端类就是修改自iphone类:

然后我们依旧像之间那样生成多个iphone

这里的关键就在于Iphone构造函数里面的this.flyweight = flyweightFactory.get(model, screen, memory)。这句代码通过享元工厂去获取享元数据,而在享元工厂里面,如果已经存在相同数据的对象则会直接返回对象,多个iphone对象共享这部分相同的数据,所以原本类似的数据已经大大减少,减少的内存的占用。

享元模式在DOM中的应用

享元模式的一个典型应用就是DOM事件操作,DOM事件机制分成事件冒泡和事件捕获。我们简单介绍一下这两者:事件冒泡:绑定的事件从最里层的元素开始触发,然后冒泡到最外层事件捕获:绑定的事件从最外层的元素开始触发,然后传到最里层假设我们HTML中有一个菜单列表

总结JavaScript设计模式编程中的享元模式使用(js常用的设计模式)

点击菜单项,进行相应的操作,我们通过jQuery来绑定事件,一般会这么做:

给每个列表项绑定事件,点击输出相应的文本。这样看暂时没有什么问题,但是如果是一个很长的列表,尤其是在移动端特别长的列表时,就会有性能问题,因为每个项都绑定了事件,都占用了内存。但是这些事件处理程序其实都是很类似的,我们就要对其优化。

通过这种方式进行事件绑定,可以减少事件处理程序的数量,这种方式叫做事件委托,也是运用了享元模式的原理。事件处理程序是公用的内在部分,每个菜单项各自的文本就是外在部分。我们简单说下事件委托的原理:点击菜单项,事件会从li元素冒泡到ul元素,我们绑定事件到ul上,实际上就绑定了一个事件,然后通过事件参数event里面的target来判断点击的具体是哪一个元素,比如低级第一个li元素,event.target就是li,这样就能拿到具体的点击元素了,就可以根据不同元素进行不同的处理。

总结

享元模式是一种优化程序性能的手段,通过共享公用数据来减少对象数量以达到优化程序的手段。享元模式适用于拥有大量类似对象并且对性能有要求的场景。因为享元模式需要分离内部和外部数据,增加了程序的逻辑复杂性,建议对性能有要求的时候才使用享元模式。

享元模式之利:可以把网页的资源符合降低几个数量级。即使享元模式的应用无法将实例的个数削减到一个,你仍能够从中获益不少。

这种节省不需要大量修改原有代码。在创建了管理器、工厂和享元之后,就需要对代码进行的修改只不过是从直接实例化目标类改为调用管理器对象的某个方法。

享元模式之弊:如果把它用在不必要的地方,其结果反而有损代码的运行效率。这种模式在优化代码的同时,也提高了其复杂程度,这会给调试和维护造成困难。

它之所以会妨碍调试,是因为现在可能出错的地方变成了三个:管理器、工厂和享元。

这种优化也会使维护变得更加困难。现在你面对的不是由封装着数据的对象构成的清晰架构,而是一堆又碎又乱的东西。其中的数据至少分两处保存。最好注释标明内在数据和外在数据。

只有在必要的时候才应该进行这种优化。必须在运行效率和可维护性之间进行权衡。如果拿不准是否需要使用享元模式,那么你很可能并不需要它。享元模式适合的是系统资源已经用得差不多而且明显需要进行某种优化这样一类场合。

这种模式对Javascript程序员特别有用,因为它可以用来减少网页上所要使用的DOM元素的数量,要知道这些元素需要耗费许多内存。结合使用这种模式与组合模式等组织型可以开发出功能丰富的复杂Web应用系统,它们可以平稳的运行在任何现代Javascript环境中。

享元模式的适用场合:网页中必须使用了大量资源密集型对象。如果只会用到少许这类对象,这种优化并不划算。

对象中所保存的数据至少有一部分能被转化为外在数据。此外,将这些数据存储在对象外部所占用的资源应该相对较少,否则这种做法对于性能的提示实际上毫无意义。那种大量包含基础性代码和HTML内容的对象可能比较适合这种优化。

将外在数据分离出去后,独一无二的对象的数目相对较少。

JavaScript中对JSON对象的基本操作示例 JSON对象1、对象的属性:对象的属性是有键值对组成的,其中key为一个字符串,value可以为任何的Javascript对象。//使用[]设置和获取对象的属性varobj=newObje

javascript RegExp 使用说明 一:正则表达式的创建方式1.文字格式,使用方法如下:/pattern/flags(即:/模式/标记)2.RegExp构造函数,使用方法如下:newRegExp("pattern"[,"flags"])(即:newRegExp

简单掌握JavaScript中const声明常量与变量的用法 ES6引入的第三个声明类关键词与let类似:const。看一下用法:constc1=1;constc2={};constc3=[];Object.getOwnPropertyDescriptor(window,"c1")//Object{value:1,writable:false,enumerable:t

标签: js常用的设计模式

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

上一篇:JavaScript中用let语句声明作用域的用法讲解(js let语句)

下一篇:JavaScript中对JSON对象的基本操作示例(JavaScript中对象方法的创建)

  • 个税可以作废重新换电脑申报吗
  • 个税申报与社保申报一定是一致的么
  • 税控系统维护费怎么做会计分录
  • 金税四期可以查个人账户吗
  • 红字发票需要认证吗之前的发票还有用吗
  • 拆迁补偿费返还政策
  • 发票金额开多了怎么处理
  • 租借车辆发生事故后的保险理赔问题
  • 建筑业暂估成本表
  • 企业分期付款购车分录怎么写
  • 实收资本转出计入什么科目
  • 快递增值税税率
  • 境外公司付款给国内公司人民币
  • 补计提去年的增值税
  • 一般纳税人净利润300万企业所得税怎么算
  • 企业自行去税务开具房租发票税款怎么做?
  • 预付款可以开专票吗
  • 报税没有报怎么办
  • 子女继承房地产怎么交税
  • 浅析税收滞纳金问题的政策法规
  • 小微企业不超过300万所得税
  • 小规模纳税人可以抵扣增值税专用发票吗
  • 集团内部股权无偿划转引起资本公积增加需要印花税
  • 12月的发票可以1月付款吗
  • 材料的盘点包括
  • 工程结算收入以前年度多结转收入怎么处理?
  • 个体户能给自己交五险吗
  • 外贸企业出口货物
  • mac语音备忘录文件怎样转换成mp3
  • php使用js
  • 交易性金融资产是什么意思
  • 建安企业所得税怎么算2.25税率
  • 公司房产税如何征收税率
  • php代码生成
  • 销售货物代垫的运费会计分录
  • 挂靠设计公司费用标准 怎么记账
  • 如何补缴以前年度的税
  • 织梦网站特有标识
  • 揭秘蒙娜丽莎25恐怖之处
  • 有形动产租赁服务的增值税税率
  • 城镇土地使用税的计税依据
  • 成品油办法废止后,加油站还需办理成品油许可证吗
  • 税收滞纳金能不能超过税款
  • 税务稽查补缴上年所得税分录
  • 增值税为什么要结转
  • 怎么对外投资
  • 客户付了订金后能退吗
  • 免税 企业
  • 待认证进项发票哪里导出来数据
  • 建设工程施工管理
  • 发票丢失如何处理入账
  • 开红字发票后再开蓝字发票如何入账
  • mysql 5.7.9 winx64在windows上安装遇到的问题
  • win7宽带自动拨号设置
  • centos7配置ssh免密码登录
  • 惠普装xp系统
  • win批处理命令
  • Win7升级win10后可以删除2345吗
  • linux删除sdb1
  • win8系统电脑卡
  • 关于植物的现代诗
  • android jdk下载
  • bat ping批处理
  • ping命令的基本使用方法
  • opengl绘制点线面
  • nodejs内置的包管理器
  • android内核剖析代码
  • 批处理实现电脑登陆二次验证
  • unity cpu优化
  • python 详细
  • linux监控程序
  • vue curd生成
  • 深入理解计算机系统 电子书
  • python函数设置
  • jquery trigger 传参数
  • Android boot.img制作
  • 如何下载成品油库存
  • 企业滞纳金怎么算 计算公式
  • 国税稽查局查账单凭个人流水能不能当做证据
  • 成都市成华区税务局新地址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设