快来get策略模式,告别编程困惑,轻松变身编程高手✨

简介: 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。

⭐  专栏简介

       欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。


       同时,我们也会关注最新的前端趋势和发展动态。随着Web技术的不断演进,前端开发也在不断推陈出新。我们会及时介绍最新的前端框架、工具和技术,使你能够站在前沿,与时俱进。通过掌握最新的前端技术,你将能够在竞争激烈的Web开发领域中有更大的竞争力。


📘  文章引言


一、策略模式是什么


策略模式(Strategy Pattern)指的是定义一系列的算法,把它们一个个封装起来,目的就是将算法的使用与算法的实现分离开来


一个基于策略模式的程序至少由两部分组成:


策略类,策略类封装了具体的算法,并负责具体的计算过程

环境类Context,Context 接受客户的请求,随后 把请求委托给某一个策略类


二、使用


举个例子,公司的年终奖是根据员工的工资和绩效来考核的,绩效为A的人,年终奖为工资的4倍,绩效为B的人,年终奖为工资的3倍,绩效为C的人,年终奖为工资的2倍


若使用if来实现,代码则如下:

var calculateBouns = function(salary,level) {
    if(level === 'A') {
        return salary * 4;
    }
    if(level === 'B') {
        return salary * 3;
    }
    if(level === 'C') {
        return salary * 2;
    }
};
// 调用如下:
console.log(calculateBouns(4000,'A')); // 16000
console.log(calculateBouns(2500,'B')); // 7500


从上述可有看到,函数内部包含过多if...else,并且后续改正的时候,需要在函数内部添加逻辑,违反了开放封闭原则


而如果使用策略模式,就是先定义一系列算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,如下:

var obj = {
        "A": function(salary) {
            return salary * 4;
        },
        "B" : function(salary) {
            return salary * 3;
        },
        "C" : function(salary) {
            return salary * 2;
        } 
};
var calculateBouns =function(level,salary) {
    return obj[level](salary);
};
console.log(calculateBouns('A',10000)); // 40000


上述代码中,obj对应的是策略类,而calculateBouns对应上下通信类


又比如实现一个表单校验的代码,常常会像如下写法:

var registerForm = document.getElementById("registerForm");
registerForm.onsubmit = function(){
    if(registerForm.userName.value === '') {
        alert('用户名不能为空');
        return;
    }
    if(registerForm.password.value.length < 6) {
        alert("密码的长度不能小于6位");
        return;
    }
    if(!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)) {
        alert("手机号码格式不正确");
        return;
    }
}


上述代码包含多处if语句,并且违反了开放封闭原则,如果应用中还有其他的表单,需要重复编写代码


此处也可以使用策略模式进行重构校验,第一步确定不变的内容,即策略规则对象,如下:

var strategy = {
    isNotEmpty: function(value,errorMsg) {
        if(value === '') {
            return errorMsg;
        }
    },
    // 限制最小长度
    minLength: function(value,length,errorMsg) {
        if(value.length < length) {
            return errorMsg;
        }
    },
    // 手机号码格式
    mobileFormat: function(value,errorMsg) {
        if(!/(^1[3|5|8][0-9]{9}$)/.test(value)) {
            return errorMsg;
        }
    } 
};



然后找出变的地方,作为环境类context,负责接收用户的要求并委托给策略规则对象,如下Validator类:

var Validator = function(){
        this.cache = [];  // 保存效验规则
};
Validator.prototype.add = function(dom,rule,errorMsg) {
    var str = rule.split(":");
    this.cache.push(function(){
        // str 返回的是 minLength:6 
        var strategy = str.shift();
        str.unshift(dom.value); // 把input的value添加进参数列表
        str.push(errorMsg);  // 把errorMsg添加进参数列表
        return strategys[strategy].apply(dom,str);
    });
};
Validator.prototype.start = function(){
    for(var i = 0, validatorFunc; validatorFunc = this.cache[i++]; ) {
        var msg = validatorFunc(); // 开始效验 并取得效验后的返回信息
        if(msg) {
            return msg;
        }
    }
};



通过validator.add方法添加校验规则和错误信息提示,使用如下:


var validateFunc = function(){
    var validator = new Validator(); // 创建一个Validator对象
    /* 添加一些效验规则 */
    validator.add(registerForm.userName,'isNotEmpty','用户名不能为空');
    validator.add(registerForm.password,'minLength:6','密码长度不能小于6位');
    validator.add(registerForm.userName,'mobileFormat','手机号码格式不正确');
    var errorMsg = validator.start(); // 获得效验结果
    return errorMsg; // 返回效验结果
};
var registerForm = document.getElementById("registerForm");
registerForm.onsubmit = function(){
    var errorMsg = validateFunc();
    if(errorMsg){
        alert(errorMsg);
        return false;
    }
}



上述通过策略模式完成表单的验证,并且可以随时调用,在修改表单验证规则的时候,也非常方便,通过传递参数即可调用


三、应用场景


从上面可以看到,使用策略模式的优点有如下:


策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句

策略模式提供了开放-封闭原则,使代码更容易理解和扩展

策略模式中的代码可以复用

策略模式不仅仅用来封装算法,在实际开发中,通常会把算法的含义扩散开来,使策略模式也可以用来封装 一系列的“业务规则”


只要这些业务规则指向的目标一致,并且可以被替换使用,我们就可以用策略模式来封装它们


⭐  写在最后


请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.


✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式


✅ 认为我部分代码过于老旧,可以提供新的API或最新语法


✅ 对于文章中部分内容不理解


✅ 解答我文章中一些疑问


✅ 认为某些交互,功能需要优化,发现BUG


✅ 想要添加新功能,对于整体的设计,外观有更好的建议


最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

相关文章
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索编程之美:从小白到大牛的代码旅程
在编程的世界里,每一行代码都是探险者的脚步,每一个bug都是成长的印记。本文将带你领略编程的魅力,从最初的迷茫到技术的熟练,一起感受那些日夜与代码为伴的日子如何塑造一个程序员的思维和人生。
|
1月前
|
设计模式 前端开发 算法
探索代码之美:我的编程之旅与实践感悟
【10月更文挑战第23天】 在数字世界的海洋中,编程是构建梦想之船的技艺。本文将带你领略编程的魅力,从我踏入这个奇妙世界的第一步开始,到逐渐掌握各种编程语言和工具的过程。我们将一起探讨编程思维的重要性、解决问题的策略,以及如何通过不断学习和实践来提升自己的技术水平。文章不仅分享了我个人的经验和技巧,还提供了实用的代码示例,旨在帮助初学者更好地理解编程概念,并为资深开发者提供新的视角和灵感。
51 2
|
2月前
|
开发者
探索代码之美:从小白到高手的编程之旅
【9月更文挑战第32天】编程,一门艺术与科学的结合体。它不仅仅是冰冷的机器语言,更是人类智慧的结晶。本文将通过一段个人的技术成长历程,揭示编程背后的哲理和美学,带你领略代码世界的深邃与奇妙。
|
2月前
|
设计模式 人工智能 算法
编程之旅:从代码到架构的感悟
【9月更文挑战第33天】在编程的世界里,代码不仅是实现功能的工具,更是连接思想与现实的桥梁。本文将通过个人的编程经历,分享从编写第一行代码到设计系统架构的旅程,探索编程背后的哲学和技术演变。我们将一起思考,如何在代码的海洋中找到自己的航向,以及在这个过程中如何不断成长和适应变化。
|
3月前
|
算法
探索代码的奥秘:从新手到高手的技术感悟
在技术的海洋中,每一行代码都如同一颗璀璨的星辰,引领着我们探索未知的宇宙。本文将分享一段从编程新手逐步成长为技术高手的旅程,以及在这个过程中积累的一些心得与感悟。
21 4
|
3月前
|
算法 开发者 Python
探索代码之美:从小白到大师的编程旅程
【9月更文挑战第15天】本文将带领读者走进编程的世界,从最初的困惑与挫败,到逐步掌握编程技能并发现其乐趣。我们将通过具体案例和代码示例,展示如何从基础语法学习,到解决实际问题,再到优化代码的过程。这不仅是技术上的提升,更是一个思维和解决问题能力成长的故事。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和启发。
|
4月前
|
算法 JavaScript 前端开发
探索代码之美——从小白到大牛的编程旅程
【8月更文挑战第26天】在编程的世界里,每一行代码都是构建梦想的基石。本文将带你领略编程的魅力,从最初的迷茫到技术的熟练,一起见证一个编程爱好者如何通过不断学习和实践,解锁新技能,最终成为领域内的专家。让我们跟随这段旅程,发现那些看似晦涩难懂的代码背后的艺术与哲理。
|
4月前
|
Java
在Java编程的江湖中,有一本传说中的“武林秘籍”,它不是刀光剑影的武学心法,而是能够让代码变得灵动、高效的秘密武器——多态。
在Java编程的江湖中,有一本传说中的“武林秘籍”,它不是刀光剑影的武学心法,而是能够让代码变得灵动、高效的秘密武器——多态。
44 1
|
3月前
|
程序员 项目管理 数据库
探索代码之美:从小白到大牛的编程旅程
【9月更文挑战第9天】在编程的世界里,每个人都是从零开始,但每一步的成长都能让我们更接近技术的深渊。本文将通过个人的技术感悟,带你领略编程的魅力和挑战,从基础语法的学习到复杂项目的管理,一起见证一个程序员如何在实践中不断进步,最终达到技术的新高度。
43 0
|
4月前
|
搜索推荐
编程之道——从代码中寻找生活的启示
【8月更文挑战第30天】在这篇文章中,我们将一起探索编程的哲学和生活的智慧如何交织在一起。通过具体的代码示例,我们不仅学习技术知识,还能领悟到如何将编程原则应用于日常生活中,以实现个人成长和问题解决。文章旨在揭示编程不仅是一系列指令的组合,更是一种思考和处理问题的方式。