JavaScript设计模式之策略模式


瞎几把扯
俗话说,条条大路(策略)通罗马(result)。在现实生活中,我们可以采用很多方法实现同一个目标。
比如我们先定个小目标,先挣它一个亿。我们可以根据具体的实际情况(按照对应的策略)来完成这个目标。

  • 策略一: 如果你是个富二代,可以接手家族生意,分分钟挣它一个亿
  • 策略二: 如果你是个官二代,可以......(你懂的)
  • 策略三: 如果你是个屌丝,可以......洗洗睡吧, 梦里啥都有

1.定义

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

情景: 公司计算年终奖,分A、B、C 三种 level,计算方式如下:

(1) level为A,年终奖等于salary乘以系数5

(2) level为B,年终奖等于salary乘以系数4

(3) level为C,年终奖等于salary乘以系数3

var Strategies = {
 "A":function(salary){
  return salary * 5;
 },
 "B":function(salary){
  return salary * 4;
 },
 "C":function(salary){
  return salary * 3;
 }
};
var caculateBonus = function(level,salary){
 return Strategies[level](salary);
};
console.log(caculateBonus("A",2000));

2.表单校验 - demo

2.1 常见的模式

在一个Web项目中,注册、登录等功能的实现都离不开表单提交
假设我们正在编写一个注册的页面,有如下几条校验逻辑:

  • 用户名不可为空,不允许以空白字符命名,用户名长度不能小于2位
  • 密码长度不能小于6位
  • 正确的手机号码格式

不使用策略模式, 不封装function的话, 我们通常会这样写:



    策略模式-校验表单
    


    
用户名: 密码: 手机号码:

这种编码方式很常见, 但它缺点也很明显:

  • registerForm.onsubmit 函数比较庞大,包含了很多if语句,这些语句要覆盖所有的校验规则
  • 若校验规则有变,不得不深入到registerForm.onsubmit 函数的内部实现,违反开放-封闭原则
  • 算法的复用性差

2.2 策略模式重构表单校验



    策略模式-校验表单
    


    
用户名: 密码: 手机号码:

总结

策略模式是一种常用且有效的设计模式

  • 有效避免多重条件选择语句
  • 提供了对开放-封装原则的支持
  • 复用性高

参考: 《JavaScript 设计模式与开发实践》

你可能感兴趣的:(JavaScript设计模式之策略模式)