JavaScript设计模式(十四):城市公交车-享元模式

简介: 城市公交车-享元模式

享元模式(Flyweight)

运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销。

分页功能:类似公交车向前一站一站的传递

image.png

<ul id="container"></ul>
<button id="next_page">下一页</button>
/**
 * 享元模式
 */
var Flyweight = (function () {
   
   

    // 存储已创建的元素
    var created = [];

    // 创建一个列表容器
    function create() {
   
   
        const container = document.getElementById('container');
        const item = document.createElement('li');
        container.appendChild(item);
        // 缓存新创建的元素
        created.push(item);
        // 返回创建的新元素
        return item;
    }

    return {
   
   
        created,
        // 通过数据渲染DOM
        renderDomByData(pageSize) {
   
   
            // 如果数据总量小于等于传入的单页最大数据量pageSize,那么创建总数居量条数据
            // 默认created为空数组小于单页数据量,自动创建li
            if (created.length < pageSize) {
   
   
                return create();
            }
            // 当 created 存满 pageSize 条数据量后不再新增DOM,而是将第一个DOM放到最后一个的位置
            else {
   
   
                // 删除数组的第一个元素,并返回删除的元素
                var li = created.shift();
                created.push(li);
                return li;
            }
        },
    }
}());

// 全部数据
let list = new Array(18).fill(null).map((_t, i) => i + 1);
// 单页条数
const pageSize = 5;
// 当前页码
let pageNum = 1;

console.log(`------------第${
     
     pageNum}页 渲染流程 开始--------------`);
// 初始化的渲染
for (let i = 0; i < pageSize; i++) {
   
   
    // 通过享元类获取创建的元素并写入内容
    Flyweight.renderDomByData(pageSize).innerText = list[i];
    console.log(Flyweight.created.map(el => el.innerText));
}
console.log(`------------第${
     
     pageNum}页 渲染流程 结束--------------`);

document.getElementById('next_page').onclick = function () {
   
   

    if (list.length <= pageSize) return;

    console.log(`------------第${
     
     pageNum + 1}页 渲染流程 开始--------------`);
    for (let i = 0; i < pageSize; i++) {
   
   
        // 通过享元类获取创建的元素并写入内容
        Flyweight.renderDomByData(pageSize).innerText = list[pageNum * pageSize + i] || '';
        console.log(Flyweight.created.map(el => el.innerText));
    }
    console.log(`------------第${
     
     pageNum + 1}页 渲染流程 结束--------------`);

    pageNum++;

};

享元动作

让继承者享受元类对象上提供的属性和方法

// 享元类 - 让继承者享受元类对象上提供的属性和方法
const Movement = {
   
   
    moveX: function (x) {
   
   
        this.x = x;
    },
    moveY: function (y) {
   
   
        this.y = y;
    }
};

// 玩家继承运动对象
let Player = function (x, y, color) {
   
   
    this.x = x;
    this.y = y;
    this.color = color;
}
Player.prototype = Movement;
Player.prototype.changeColor = function (color) {
   
   
    this.color = color;
};

// 精灵继承运动对象
let Sprite = function(x, y, radius){
   
   
    this.x = x;
    this.y = y;
    this.radius = radius;
}
Sprite.prototype = Movement;
Sprite.prototype.changeRadius = function(radius){
   
   
    this.radius = radius;
}

享元模式特点

主要还是对其数据、方法共享分离,它将数据方法分成内部数据内部方法外部数据外部方法

内部方法与内部数据指的是相似或者共有的数据和方法,所以将这一部分提取出来减少开销,以提高性能。

就像城市里人们每天上班或者学生上学都要走一定的路。他们有的人开私家车,有的坐公交,当然我们是很容易看出坐公交在花费上要比私家车的开销少很多,主要是因为它让更多的人共有这一交通工具。

目录
相关文章
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
2月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
39 3
|
3月前
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
|
4月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
4月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
66 1
|
4月前
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的贝立立城市货运服务系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的贝立立城市货运服务系统附带文章源码部署视频讲解等
26 0
|
5月前
|
设计模式 JavaScript 前端开发
JavaScript进阶 - JavaScript设计模式
【7月更文挑战第7天】在软件工程中,设计模式是解决常见问题的标准解决方案。JavaScript中的工厂模式用于对象创建,但过度使用可能导致抽象过度和缺乏灵活性。单例模式确保唯一实例,但应注意避免全局状态和过度使用。观察者模式实现了一对多依赖,需警惕性能影响和循环依赖。通过理解模式的优缺点,能提升代码质量。例如,工厂模式通过`createShape`函数动态创建对象;单例模式用闭包保证唯一实例;观察者模式让主题对象通知多个观察者。设计模式的恰当运用能增强代码可维护性。
86 0
|
5月前
|
设计模式 缓存 JavaScript
js设计模式实例
【7月更文挑战第2天】JavaScript设计模式包含工厂、单例、建造者、抽象工厂和代理模式等,它们是最佳实践和可重用模板,解决创建、职责分配和通信等问题。例如,工厂模式封装对象创建,单例确保全局唯一实例,建造者模式用于复杂对象构建,抽象工厂创建相关对象集合,而代理模式则控制对象访问。这些模式提升代码质量、可读性和灵活性,是高效开发的关键。
43 0
|
1月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
27 1
JavaScript中的原型 保姆级文章一文搞懂