js设计模式之结构型享元模式详解

发布时间 - 2026-01-11 03:04:02    点击率:

运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销。
享元模式主要是对其数据、方法共享分离,将数据和方法分成内部数据、内部方法和外部数据、外部方法。内部方法与内部数据指的是相似或共有的数据和方法,所以将其提取出来减少开销。

var Flyweight = function() {
 // 已创建的元素
 var created = [];
 // 创建一个新闻包装容器
 function create() {
  var dom = document.createElement('div');
  // 将容器插入新闻列表容器中
  document.getElementById('container').appendChild(dom);
  // 缓存新创建的元素
  created.push(dom);
  // 返回创建的新元素
  return dom;
 }
 return {
  // 获取创建新闻元素方法
  getDiv: function() {
   // 如果已创建的元素小于当前页元素总个数(5个),则创建
   if(created.length < 5) {
    return created();
   } else {
    // 获取第一个元素,并插入去后面
    var div = created.shift();
    created.push(div);
    return div;
   }
  }
 }
}

上面创建一个享元类,由于每页只能显示5条新闻,所以创建5个元素,保存在享元类内部,可以通过getDiv方法来获取创建的元素。下面就要实现外部数据和外部方法,外部数据就是我们要显示的所有新闻内容,由于每个内容都不一样肯定不能共享。

var paper = 0,
  num = 5,
  len = article.length;
// 添加五条新闻
for(var i = 0; i < 5; i++) {
 if(article[i])
 // 通过享元类获取创建的元素并写入新闻内容
 Flyweight.getDiv().innerHTML = article[i];
}


// 下一页按钮绑定事件
document.getElementById('next_page').onclick = function() {
 // 如果新闻内容不足5条则返回
 if(article.length < 5) {
  return;
 }
 var n = ++paper * num % len, // 获取当前页的第一条新闻索引
   j = 0;
 // 插入5条新闻
 for(; j < 5; j++) {
  // 如果存在n+j条则插入
  if(article[n + j]) {
   Flyweight.getDiv().innerHTML = article[n + j];
  // 否则插入起始位置第n+j-len条
  } else if(article[n + j - len]) {
   Flyweight.getDiv().innerHTML = article[n + j - len];
  } else {
   Flyweight.getDiv().innerHTML = "";
  }
 }
}


这样用享元模式对页面重构之后每次操作只需要操作5个元素,这样性能可以提高很多。
享元模式的应用是为了提高程序的执行效率与系统性能,因此在大型系统开发中应用比较广泛,可以避免程序中的数据重复。应用时一定要找准内部状态与外部状态,这样才能更合理地提取分离。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# js  # 设计模式  # 结构型享元模式  # 结合ES6 编写 JavaScript 设计模式中的结构型模式  # 创建一个  # 都不  # 第一个  # 下一页  # 当前页  # 将其  # 每页  # 对其  # 可以通过  # 有效地  # 只需要  # 第一条  # 指的是  # 方法来  # 绑定  # 大家多多  # 找准  # 五条  # 重构  # 主要是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: jquery插件bootstrapValidator表单验证详解  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何破解联通资金短缺导致的基站建设难题?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  EditPlus 正则表达式 实战(3)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  js代码实现下拉菜单【推荐】  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在IIS管理器中快速创建并配置网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel怎么在Controller之外的地方验证数据  如何在景安云服务器上绑定域名并配置虚拟主机?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  香港服务器如何优化才能显著提升网站加载速度?  如何在万网自助建站中设置域名及备案?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Android自定义listview布局实现上拉加载下拉刷新功能  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  如何在宝塔面板中修改默认建站目录?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何在建站之星网店版论坛获取技术支持?  JavaScript如何实现倒计时_时间函数如何精确控制  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Java遍历集合的三种方式  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  浅析上传头像示例及其注意事项  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  进行网站优化必须要坚持的四大原则  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  非常酷的网站设计制作软件,酷培ai教育官方网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何在阿里云服务器自主搭建网站?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】