JavaScript设计模式(三十八):三军统帅-MVP模式

简介: 三军统帅-MVP模式

MVP

即模型(Model)- 视图(View)- 管理器(Presenter):View层不直接引用Model层内的数据,而是通过Presenter层实现对Model层内的数据访问。即所有层次的交互都发生在Presenter层中。

示例

image.png

<div id="container"></div>
AI 代码解读
// MVP模式
class MVP {
   
   
    /**
     * MVP构造函数
     * @param {Array || {name, data, pst}} args
     *      @param {string} name 模块名称
     *      @param {any} data 数据
     *      @param {Function} pst 管理器模块
     */
    constructor(...args) {
   
   
        let arr = Array.isArray(args[0]) ? args[0] : [{
   
    name: args[0], data: args[1], pst: args[2] }];
        arr.forEach(m => {
   
   
            // 在数据层添加数据
            this.model.setData(m.name, m.data);
            // 在管理器层添加管理器模块
            this.presenter.add(m.name, m.pst);
        });
    }

    // 数据层
    model = (function () {
   
   
        let M = {
   
   };
        // 存储数据层数据
        M.data = {
   
   };
        return {
   
   
            /**
             * 获取数据
             * @param {string} m 模块名称
             * @returns 数据
             */
            getData(m) {
   
   
                return M.data[m];
            },
            /**
             * 设置数据
             * @param {string} m 模块名称
             * @param {any} value 数据
             * @returns 数据
             */
            setData(m, value) {
   
   
                M.data[m] = value;
                return value;
            },
            // 整和 数据 + HTML字符串
            formatString(str, data) {
   
   
                return str.replace(/\{#(\w+)#\}/g, function (_match, key) {
   
   
                    return data[key];
                })
            },
        }
    }());

    // 视图层 - 解析模板
    view = (function () {
   
   
        // 模板解析器
        return function (html) {
   
   
            /**
             * code....
             * 可自定义模版进行解析
             * code....
             */
            return html;
        }
    }());

    // 管理器层
    presenter = (function (that) {
   
   
        let M = that.model;
        let V = that.view;
        // 存储模板管理器
        let P = {
   
   };
        return {
   
   
            // 执行方法
            init() {
   
   
                // 遍历内部管理器
                for (let k in P) {
   
   
                    // 执行所有管理器内部逻辑
                    P[k] && P[k](M, V, k);
                }
            },
            /**
             * 添加管理器
             * @param {string} name 模块名称
             * @param {Function} pst 管理器
             */
            add(name, pst) {
   
   
                P[name] = pst;
                return this;
            }
        };
    }(this));

    // MVP入口
    init = (function (that) {
   
   
        return function () {
   
   
            that.presenter.init();
            return that;
        }
    }(this));
}
AI 代码解读
let obj = {
   
   
    // 模块名称
    name: 'nav',
    // 数据
    data: [
        {
   
    label: '新闻头条', type: 'news', url: '#' },
        {
   
    label: '最新电影', type: 'movie', url: '#' },
        {
   
    label: '热门游戏', type: 'game', url: '#' },
        {
   
    label: '今日特价', type: 'price', url: '#' },
    ],
    // 管理器
    pst: function (M, V, name) {
   
   
        let data = M.getData(name);
        let tpl = V(`
            <li class="{#type#}">
                <a href="{#url#}" title="{#label#}">{#label#}</a
            </li>
        `);
        let nav = document.createElement('ul');
        nav.id = name;
        nav.className = 'nav';
        data.forEach(d => {
   
   
            nav.innerHTML += M.formatString(tpl, d);
        });
        document.getElementById('container').appendChild(nav);
    }
};

new MVP([obj]).init();
AI 代码解读

特点

管理层(presenter),负责管理数据、UI视图创建、交互逻辑、动画特效等等一切事务。因此管理层也就强大起来。这样数据层只负责存储数据,视图层只负责创建视图模板,他们的业务独立而又单一,因此我们添加或修改模块,只需要对管理器层做处理就足够了。

MVP与MVC相比最重要的特征就是MVP中将视图层与数据层完全解耦,使得对视图层的修改不会影响到数据层,数据层内的数据改动又不会影响到视图层。

因此,我们在管理器中对数据或者视图灵活地调用就可使数据层内的数据与视图层内的视图得到更高效的复用。

因此,MVP模式也可以实现一个管理器,可以调用多个数据,或者创建多种视图,而且是不受限制的。

因而管理器有更高的操作权限,因此对于业务逻辑与需求的实现只需专注于管理器的开发即可,当然管理器内过多的逻辑也使得其开发与维护成本提高。

目录
相关文章
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
86 16
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
63 0
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
50 0
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
47 0
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
335 11
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
67 0
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
528 44
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
6月前
|
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
122 40

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等