We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化
目的是将算法的使用和算法的实现分离开。
策略模式至少包含两个部分:
我们首先来看基于传统面向对象语言的模仿,各个类的职责体现得更加鲜明。
class performanceS { calculate(salary) { return salary * 4 } } class performanceA { calculate(salary) { return salary * 3 } } class performanceB { calculate(salary) { return salary * 2 } } class Bonus { constructor() { this.salary = null this.strategy = null } setSalary(salary) { this.salary = salary } setStrategy(strategy) { this.strategy = strategy } getBonus() { return this.strategy.calculate(this.salary) } } let bonus = new Bonus() bonus.setSalary(10000) bonus.setStrategy(new performanceS()) console.log(bonus.getBonus()) // 输出 40000 bonus.setStrategy(new performanceA()) console.log(bonus.getBonus()) // 输出 30000
在JavaScript的策略模式中,策略类往往基于函数实现,因此策略模式在 JS 中是”隐形“的,我们通过高阶函数封装不同的行为,并把它传递到另一个函数(策略类)中,当我们调用这些高阶函数时,不同的函数调用返回不同的结果。
let strategies = { "S": function(salary) { return salary * 4 }, "A": function(salary) { return salary * 3 }, "B": function(salary) { return salary * 2 } } let calculateBonus = function(level, salary) { return strategies[level](salary) } console.log(calculateBonus('S', 20000)) console.log(calculateBonus('A', 10000))
策略模式
The text was updated successfully, but these errors were encountered:
No branches or pull requests
定义
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化
目的
目的是将算法的使用和算法的实现分离开。
组成
策略模式至少包含两个部分:
一个计算奖金的例子
我们首先来看基于传统面向对象语言的模仿,各个类的职责体现得更加鲜明。
JavaScript 版本的策略模式(不需要用到类的概念)
在JavaScript的策略模式中,策略类往往基于函数实现,因此策略模式在 JS 中是”隐形“的,我们通过高阶函数封装不同的行为,并把它传递到另一个函数(策略类)中,当我们调用这些高阶函数时,不同的函数调用返回不同的结果。
优点:
缺点:
应用场景
总结
参考
策略模式
The text was updated successfully, but these errors were encountered: