理解js设计模式之策略模式
来源:互联网 发布:网络音乐吧飘飘可可mp3 编辑:程序博客网 时间:2024/05/16 11:49
策略模式的定义:定义一系列的算法,然后根据实际情况去调用
一个小插曲:最近在项目的过程中接手了一个比较复杂的需求,由于是旧的项目用新的框架重构,所以能够看见以前的代码,吸取下前人代码的精华,复用一些可用的代码,免得自己写半天。。当然这篇的主题是策略模式,不会离题,因为当我完成了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对象
- 理解js设计模式之策略模式
- 设计模式之策略模式理解
- 设计模式之策略模式理解
- 简单理解设计模式之策略模式
- 理解设计模式之策略模式
- JS设计模式之策略模式
- JS设计模式之策略模式
- 设计模式理解-策略模式
- 理解js设计模式之代理模式
- 理解js设计模式之代理模式
- JS 设计模式--策略模式
- JS设计模式-策略模式
- js之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 骨骼蒙皮动画(Skinned Mesh)的原理解析(一)
- Nginx 日志查询(类型于SQL条件的多样式查询)
- 超强PHP集成环境,支持800多个不同PHP版本同时运行,无限自定义添加mysql与php版本
- Grafana Time Range设置实现同一Dashboard下不同Graph时间独立
- 论文笔记:ThiNet——一种filter级的模型裁剪算法
- 理解js设计模式之策略模式
- 简易解说拉格朗日对偶(Lagrange duality)
- 运维定位服务故障时,前5分钟都在忙啥?
- html网页布局之大盒套小盒布局
- 纯绿色集成环境,可切换180个Mysql、700个PHP版本
- Dubbo_spring配置说明
- JVM学习笔记(1)
- eclipse在线安装svn插件
- Javascript的for-in语句和with语句