定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

代码示例

  1. var strategies = {
  2. "S": function (salary) {
  3. return salary * 4;
  4. },
  5. "A": function (salary) {
  6. return salary * 3;
  7. },
  8. "B": function (salary) {
  9. return salary * 2;
  10. },
  11. };
  12. var calculateBonus = function (level, salary) {
  13. return strategies[level](salary);
  14. };
  15. console.log(calculateBonus('S', 20000));
  16. console.log(calculateBonus('A', 10000));

将所有的算法封装到策略( strategy )对象中,使用一个服务( service )方法判断根据客户端调用传入的不同参数实施不同的策略。使用策略模式后的代码,通用性、复用率大大提升可以在多场合使用或者封装为插件。

优点

  • 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重添加选择语句。

  • 策略模式提供了对开放 - 封闭等技术和思想,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展。

  • 策略模式中的算法也可以复用在系统的其它地方,从而避免许多重复的复制粘贴工作。

  • 在策略模式中利用组合和委托来让 Context 用于执行算法的能力,这也是继承的替代方案。

一等函数对象与策略模式

在JavaScript 语言中函数作为一等对象,策略模式是隐形的。strategy 就是值为函数的变量。除了使用类来封装算法和行为外,使用函数也是一种选择。这些算法可以到处被传递,策略模式融入语言本身,我们对函数发出调用的消息时,不同函数执行2返回不同的执行结果。JavaScript 中函数的多态性变得更为简单。

实例代码

  1. var S = function(salary) {
  2. return salary * 4;
  3. };
  4. var S = function(salary) {
  5. return salary * 3;
  6. };
  7. var S = function(salary) {
  8. return salary * 2;
  9. };
  10. var calculateBonus = function(func, salary) {
  11. return func( salary );
  12. };
  13. calculateBonus( S, 10000 ); // 40000

参考

[1] JavaScript 设计模式与开发实践 @ 曾探