《JavaScript设计模式》笔记 之 享元模式

享元模式

享元模式:运用共享的技术有效地支持大量的细颗粒度的对象,避免对象间拥有多余的开销。

翻页需求

有个按钮点击显示下一页内容。一页有五条数据。

version 1.0

 var dom = null,
   pager = 0,
   num = 5,
   len = articles.length;
 for (var i = 0; i < len; i++) {
   dom = document.createElement('div')
   dom.innerHTML = articles[i];
   if (i >= num) {
     dom.style.display = 'none'
   }
   document.getElementsById('container').appendChild(dom)
 }
 // 下一页绑定事件
 document.getElementsById('next_page').onclick = function () {
   var div = document.getElementsByTagName('div');
   var j = k = n = 0;
   n = ++pager % Math.ceil(len / num) * num;
   for (var j = 0; j < len; j++) {
     div[j].style.display = 'none'
   };
   for (var k = 0; k < 5; k++) {
     if (div[n + k]) {
       div[n + k].style.display = 'block'
     }
   }
 }

总的来说,就是先把页面所有数据先渲染出来,追加到容器里,再全部隐藏。点击下一页按钮,指定的五条信息显示。

缺点

如果数目太多,几百条,同时都要插入页面还要做显示隐藏操作,会影响浏览器性能,而且其实新闻结构都差不都只是内容不一样。享元模式主要对数据、方法共享分离。

享元模式

version 2.0

 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 () {
       if (created.length < 5) {
         return create()
       } else {
         var div = created.shift();
         created.push(div);
         return div;
       }
     }
   }
 }

 var pager = 0,
   num = 5,
   len = articles.length;
 for (var i = 0; i < 5; i++) {
   if (article[i]) {
     Flyweight.getDiv().innerHTML = articles[i];
   }
 }


 // 下一页绑定事件
 document.getElementsById('next_page').onclick = function () {
   if (article.length < 5)
     return;
   var n = ++pager * num % len;// 下一页之后起始下标
   for (var j = 0; j < 5; j++) {
     if (article[n + j]) {
       Flyweight.getDiv().innerHTML = article[n + j]
     } else if (article[n + j - len]) {
       Flyweight.getDiv().innerHTML = article[n + j - len]
     } else {
       Flyweight.getDiv().innerHTML = ""
     }
   };
 }

将新建div子元素追加容器里封装一个方法。而且每次操作只操作当前页的五条数据。再加上相对之前操作dom少,性能也就提升了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值