理解js设计模式之策略模式

  策略模式的定义:定义一系列的算法,然后根据实际情况去调用

  一个小插曲:最近在项目的过程中接手了一个比较复杂的需求,由于是旧的项目用新的框架重构,所以能够看见以前的代码,吸取下前人代码的精华,复用一些可用的代码,免得自己写半天。。当然这篇的主题是策略模式,不会离题,因为当我完成了Version 1 后,项目里面大量的if-else 字段的验证都放在一个函数里面,而且不同字段有些还会相互影响,导致代码很长很乱大概有几十行的if else ,丝毫没有条理;这个时候,需要去重构这个原本的底层验证函数,那么就用上了策略模式

  给个策略模式放光彩的场景:验证一行数据的每一个字段的正确性,每一行的数据字段假设有6个,验证这6个字段的正确性,返回结果

  然后:假设6个字段分别是A B C D E F;

  如果不用策略模式,代码如下:

function check(data){
   //data={A: ,B:  ,C:   ......}
   if(data.A==???){
   
   }else{
     
   }
   if(data.B==???){
   
   }else{
     
   }
   if(data.C==???){
   
   }else{
     
   }
 .
 .
 .
}

  这是糟糕的方式,那么进入策略模式的解决方案:

  首先,策略模式意味着你要有策略,什么是策略?就是每一种情况对应的解决方案 ;

       将函数内部的每个字段的方法抽离出来,这些一个个的判断方法就是策略!

  策略模式还有一个条件是什么?需要用到策略的地方能够访问到你的策略,抽离成函数的表现就是调用其他函数

       如何组织策略?抽离成一个一个的函数,然后调用,返回结果,但是这样子函数又显得非常的多,难以维护,js对象字面量提供了非常优雅的解决方案

var myStrategy={
  A:function(value){
     //判断
     return result
  },
  B:function(value){
     //判断
     return result
  },
  C:function(value){
     //判断
     return result
  },
  D:function(value){
     //判断
     return result
  },
  E:function(value){
     //判断
     return result
  },
  F:function(value){
     //判断
     return result
  }
}

  这样子,就建立了一个策略对象,你可以通过新建一个js文件,保存页面所需要的各种策略,和底层的验证函数,需要用到的地方再去引用这个js文件这样应该是比较好的方式

  那么如何使用策略?

function  checke(data){
  var strategy=require('myStrategy'),//获得策略对象
      result={};
  for(var key in data){  //假设key=A 那么,下面执行的就是:
    result[key]=strategy[key](data[key]);   //result.A=strategy.A( data.A )
  }
  return result;
}

  超级6的有没有,解释下上面的行为

  1,获得策略对象

  2,遍历数据对象,拿到每一次的 key ,也就是ABCDEF这些,

  3,然后去策略里面找对应的策略方法,执行拿到返回结果

  4,将结果赋给本地的result对象,里面的key,ABCDEF,保存着对应的字段错误信息,返回这个result对象

 

转载于:https://www.cnblogs.com/llauser/p/7382592.html

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