资讯专栏INFORMATION COLUMN

JS策略模式《JavaScript设计模式与开发实践》阅读笔记

Amos / 2076人阅读

摘要:策略模式可以避免代码中的多重判断条件。策略模式在程序中或多或少的增加了策略类。此文仅记录本人阅读设计模式与开发实践这个本时的感受,感谢作者曾探写出这么好的一本书。设计模式中很重要的一点就是将不变和变分离出来。参考设计模式与开发实践曾探

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换

策略模式可以避免代码中的多重判断条件。

策略模式很好的体现了开放-封闭原则,将一个个算法(解决方案)封装在一个个策略类中。便于切换,理解,扩展。

策略中的各种算法可以重复利用在系统的各个地方,避免复制粘贴。

策略模式在程序中或多或少的增加了策略类。但比堆砌在业务逻辑中要清晰明了。

违反最少知识原则,必须要了解各种策略类,才能更好的在业务中应用。

此文仅记录本人阅读《JavaScript设计模式与开发实践》这个本时的感受,感谢作者曾探写出这么好的一本书。如有冒犯,如有错误,请联系本人处理。

简单的业务场景
计算员工年终奖需要根据不同的员工绩效计算不同的奖金。例如,绩效为S的人年终奖有4倍工资。绩效A的人年终奖有3倍工资,绩效B的人有2倍工资。

用代码实现:

var calculateBonus = function(performanceLevel, salary) {
    if (performanceLevel === "S") {
        return salary * 4
    }
    if (performanceLevel === "A") {
        return salary * 3
    } 
    if (performanceLevel === "B") {
        return salary * 2
    }
}

calculateBonus("S", 2000) // 8000
calculateBonus("A", 2000) // 6000

其实上面一段代码已经能应付目前的场景。但是,当奖金的评定需要增加一个绩效C,或者改变绩效A的计算方式。此时需要更改上面这个calculateBonus方法的内部结构,如此下去,这个方法内部将变得冗杂。

设计模式中很重要的一点就是将不变和变分离出来。这里变的是怎么算。不变的是根据一个绩效获得一个结果。所以上述代码重写,把各种算法封装在一个个策略类中(传统面向对象的模仿):

var performanceS = function() {}
performanceS.prototype.calc = function(salary) {
    return salary * 4
}

var performanceA = function() {}
performanceA.prototype.calc = function(salary) {
    return salary * 3
}

var performanceB = function() {}
performanceB.prototype.calc = function(salary) {
    return salary * 2
}

//奖金类Bonus
var Bonus = function() {
    this.salary = null //原始工资
    this.strategy = null // 绩效等级对应的策略对象
}

Bonus.prototype.setSalary = function(salary) {
    this.salary = salary //设置工资
}

Bonus.prototype.setStrategy = function(strategy) {
    this.strategy = strategy //设置员工绩效对应的策略对象
}

Bonus.prototype.getBonus = function() { //获取奖金数额
    return this.strategy.calc(this.salary) //把计算奖金的操作委托个对应的策略对象
}

var bonus = new Bonus()
bonus.setSalary(10000)
bonus.setStrategy(new performanceA())

console.log(bonus.getBonus()) // 30000
JavaScript版本的策略模式

在JavaScript中可以将一个个策略类写成函数,然后封装在对象中:

// 计算奖金的例子
var strategies = {
    S: function(salary) {
        return salary * 4
    },
    A: function(salary) {
        return salary * 3
    },
    B: function(salary) {
        return salary * 2
    }
}

var calculateBonus = function(level, salary) {
    return strategies[level](salary)
}

console.log(calculateBonus("S", 10000)) // 40000
console.log(calculateBonus("S", 20000)) // 80000
更广义的“算法”

策略模式指的是一系列的算法(策略),并且把它们封装起来。计算奖金的列子中就封装了一些算法。其实世纪业务中也可以利用策略模式来封装一些“业务规则”。

表单验证

在Web项目中往往有很多场景需要提交表单。前端在把数据提交到后端之前,需要进行一波表单验证,来减少不必要的网络请求。在表单验证中往往会有多种校验规则,页面中可能会有多个表单要进行验证。此时可以用策略模式来实现一个表单验证:

输入用户名: 输入密码: 输入手机号码:
总结

在日常开发中一些工具函数可以封装在一起,组成自己的工具库。减少不必要的代码复制粘贴。

感觉敲代码思想更重要啦,这里策略模式体现了开放-封闭原则降低代码的耦合度。这些理念都是我自己在敲代码的路上要慢慢学习和积累的。

敲出来的代码不能只有自己认识。要多注意细节,时刻去想哪些代码可以再多完善。

当然不是所有的东西都要分来分去,一个简单的需求为了设计模式而去设计模式也是不可取的。

love & peace

参考

《JavaScript设计模式与开发实践》—— 曾探

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95346.html

相关文章

  • JS迭代器模式JavaScript设计模式开发实践阅读笔记

    摘要:但实际中,内部迭代器和外部迭代器两者并无优劣。迭代器并不只迭代数组迭代器模式不仅能迭代数组,还可以迭代一些类数组对象。晚安了,参考设计模式与开发实践曾探本文作者本文链接迭代器模式设计模式与开发实践阅读笔记 迭代器模式:一个相对简单的模式,目前绝大多数语言都内置了迭代器,以至于大家都不觉得这是一种设计模式 迭代器模式 迭代器模式指提供一种方法访问一个聚合对象中的各个元素,而又不需要暴露该...

    djfml 评论0 收藏0
  • JS代理模式JavaScript设计模式开发实践阅读笔记

    摘要:保护代理和虚拟代理保护代理当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。虚拟代理在程序中可以能有一些代价昂贵的操作。而虚拟代理是最常用的一种代理模式。 代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。...

    mist14 评论0 收藏0
  • 某熊的技术之路指北 ☯

    某熊的技术之路指北 ☯ 当我们站在技术之路的原点,未来可能充满了迷茫,也存在着很多不同的可能;我们可能成为 Web/(大)前端/终端工程师、服务端架构工程师、测试/运维/安全工程师等质量保障、可用性保障相关的工程师、大数据/云计算/虚拟化工程师、算法工程师、产品经理等等某个或者某几个角色。某熊的技术之路系列文章/书籍/视频/代码即是笔者蹒跚行进于这条路上的点滴印记,包含了笔者作为程序员的技术视野、...

    shadowbook 评论0 收藏0
  • JavaScript设计模式开发实践》读书笔记

    摘要:订阅模式的一个典型的应用就是后面会写一篇相关的读书笔记。享元模式享元模式的核心思想是对象复用,减少对象数量,减少内存开销。适配器模式对目标函数进行数据参数转化,使其符合目标函数所需要的格式。 设计模式 单例模式 JS的单例模式有别于传统面向对象语言的单例模式,js作为一门无类的语言。使用全局变量的模式来实现单例模式思想。js里面的单例又分为普通单例和惰性单例,惰性单例指的是只有这个实例...

    Panda 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<