快来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


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


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

相关文章
|
1月前
|
算法 程序员
编程之舞:探索代码之美
【10月更文挑战第3天】本文将带您领略编程的艺术,从初学者的困惑到专家的洞察,我们将一起探讨如何通过代码表达创意,解决问题,并实现技术与美学的完美结合。准备好随着代码的节奏起舞,发现那些隐藏在逻辑背后的美吧!
|
2月前
|
算法
编程之舞:从代码中领悟生活的节奏
【9月更文挑战第20天】在数字的海洋里,每一行代码都是舞者的步伐,每一个算法都蕴含着节奏的韵律。本文将通过编程的视角,探索技术与生活的和谐共舞,揭示如何在日常开发工作中寻找到生活的节拍,以及这种节奏如何引导我们更高效地解决问题。
|
2月前
|
存储 容器
从代码中感悟生活:编程与人生哲学的交融
【9月更文挑战第27天】在键盘敲击的节奏中,隐藏着生活的哲理。代码不仅仅是冷冰冰的命令序列,它反映了我们解决问题的方式,甚至揭示了人生的智慧。本文将通过编程的视角,探讨如何将技术经验转化为对生活的深刻理解,用简单的例子说明复杂概念,让你在轻松阅读中获得启发。
|
2月前
|
算法 开发者 Python
探索代码之美:从小白到大师的编程旅程
【9月更文挑战第15天】本文将带领读者走进编程的世界,从最初的困惑与挫败,到逐步掌握编程技能并发现其乐趣。我们将通过具体案例和代码示例,展示如何从基础语法学习,到解决实际问题,再到优化代码的过程。这不仅是技术上的提升,更是一个思维和解决问题能力成长的故事。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和启发。
|
3月前
|
Java
在Java编程的江湖中,有一本传说中的“武林秘籍”,它不是刀光剑影的武学心法,而是能够让代码变得灵动、高效的秘密武器——多态。
在Java编程的江湖中,有一本传说中的“武林秘籍”,它不是刀光剑影的武学心法,而是能够让代码变得灵动、高效的秘密武器——多态。
37 1
|
2月前
|
程序员 项目管理 数据库
探索代码之美:从小白到大牛的编程旅程
【9月更文挑战第9天】在编程的世界里,每个人都是从零开始,但每一步的成长都能让我们更接近技术的深渊。本文将通过个人的技术感悟,带你领略编程的魅力和挑战,从基础语法的学习到复杂项目的管理,一起见证一个程序员如何在实践中不断进步,最终达到技术的新高度。
40 0
|
3月前
|
算法 程序员
代码之舞:编程艺术与技术感悟
在数字世界的广阔舞台上,编程不仅是逻辑的堆砌与算法的运行,它更像是一场精心编排的舞蹈。本文将通过个人的技术旅程,探讨编程之美,揭示如何将枯燥的代码转变为优雅的解决方案,并分享在技术探索中收获的深刻感悟。
37 2
代码之舞:我的编程之旅与技术感悟
在数字世界的无限舞台上,每一行代码都像是精心编排的舞步,共同谱写着技术的交响曲。本文将带领读者穿梭于编程的世界,探索那些隐藏在逻辑严谨与创新自由之间的奥秘。从最初的迷茫到渐渐的熟练,每一次的挑战都是自我提升的机会。文章旨在分享个人的技术成长历程,展现编程之美,并鼓励更多的技术爱好者踏上属于自己的代码之旅。我们将一同见证,如何在细节中追求完美,在复杂中寻找简单,最终在技术的海洋里找到自己的航道。
|
4月前
|
算法 程序员
代码之舞:我的编程技术感悟
在数字世界中,编程如同一场精妙的舞蹈,每一个字符、每一行代码都承载着创造者的意图与情感。本文将通过个人的技术成长历程,探索编程之美,揭示那些看似枯燥代码背后的艺术与智慧。从初识编程的困惑到逐渐领悟编程的真谛,每一步都充满了挑战与惊喜。让我们一起走进编程的世界,感受它的无限魅力。
37 1
|
3月前
|
算法 程序员
代码之舞:编程艺术与实践感悟
在数字世界的舞台上,代码如同舞者的每一步,既是精确的科学,也是流动的艺术。本文将深入探讨编程背后的哲学和美学,通过个人的技术实践经历,揭示如何将创造性思维融入日常开发工作,提升代码质量,以及如何在解决问题的过程中找到乐趣和成就感。