当前位置:首页 > 日记 > 正文

对Javascript系列(33)的深刻理解:设计模式策略模式的详细解决方案

对Javascript系列(33)的深刻理解:设计模式策略模式的详细解决方案
介绍

策略模式定义算法家族并封装它们,以便它们彼此替换。这种模式使得算法的变化不影响算法的用户。

文本

在我们理解的策略,第一个例子,在正常情况下,如果我们想做数据验证,很多都与开关语句判断的依据,但它会带来一些问题,首先,如果需求增加,我们又想修改代码,增加逻辑,当单元测试将变得越来越复杂,代码如下:

复制代码代码如下所示:

验证= { {

验证:函数(值,类型){

开关(类型){

case'isnonempty:

{

返回true; / /非空验证结果

}

case'isnumber:

{

返回true;数字验证结果

打破;

}

case'isalphanum:

{

返回true; / /字母数字验证结果

}

违约:

{

返回true;

}

}

}

};

测试

警报(validator.validate(123
如何避免上述代码中出现的问题根据策略模式,我们可以将相同的工作代码独立地分为不同的类,然后通过统一的策略处理类处理它们。好的,我们首先定义策略处理类。代码如下:

复制代码代码如下所示:

VaR验证= { {

所有的验证规则都位于单独定义后面

类型:{ },

对应于验证错误消息的类型。

消息:{ },

当然,需要使用类型验证

配置:{ },

公开曝光/验证方法

参数

验证:函数(数据){

var i,味精,类型检查器,result_ok;

清空所有错误消息

this.messages = { };

对于(i在数据中){

如果(data.hasownproperty(I)){

根据检查验证规则是否存在

检查器=这个类型。

如果(!型){

继续;如果验证规则不存在,则不进行处理。

}

(如果!检查器)如果验证规则类不存在,则抛出异常。

把{

名称:个

消息:没有验证类型+类型

};

}

result_ok = checker.validate(数据{我}); / /使用检查核实个人验证类

如果(!result_ok){

味精=无效值为*+我+*+ checker.instructions;

This.messages.push(MSG);

}

}

}

返回this.haserrors();

},

赫尔珀

haserrors:函数(){

返回this.messages.length = = 0;

}

};
接下来的工作是定义存储在类型中的所有验证类,我们只给出几个示例。

复制代码代码如下所示:

验证给定值是否为空。

validator.types.isnonempty = { {

验证:函数(值){

返回值;

},

说明:传入值不能为空

};

验证给定值是否为

validator.types.isnumber = { {

验证:函数(值){

返回!IsNaN(值);

},

说明:传入的值只能是合法数字,例如:1、3.14或2010 。

};

验证给定值是否只有字母或数字。

validator.types.isalphanum = { {

验证:函数(值){

返回!a-z0-9 } { ^ / / i.test(价值);

},

说明:传入的值只能保护字母和数字,并且不包含特殊字符。

};
在使用它时,我们首先定义需要验证的数据集,然后我们需要定义每个数据需要验证的规则类型。代码如下:

复制代码代码如下所示:

var数据{ {

first_name:汤姆

last_name:徐

年龄:未知

用户名:tomxu

};

validator.config = { {

first_name:'isnonempty,

年龄:'isnumber,

用户名:'isalphanum

};
最后,获得验证结果的代码很简单:

复制代码代码如下所示:

validator.validate(数据);

如果(validator.haserrors()){

console.log(validator.messages.join());

}
总结

策略模式定义了一系列算法。从概念上讲,所有这些算法都在做同样的事情,但只实现不同的方式。它们可以以相同的方式调用所有方法,并减少算法类和算法类之间的耦合。

在另一个层次上,单元测试也很方便地单独定义算法类,因为它们可以通过自己的算法逐个测试。

在实际应用中,不仅可以封装算法,而且可以封装几乎任何类型的规则,因此在分析过程中需要不同的业务规则应用,因此我们可以考虑采用策略模式来处理各种变化。

相关文章

ps使用一个过滤器来快速更改字符的

ps使用一个过滤器来快速更改字符的

字符,过滤器,背景,快速,电脑软件,本文主要介绍了一个用ps快速过滤背景的人物,教程很好学,和你喜欢的朋友可以一起看。 首先看看效果: {原} {效果图} 材料: 打开原始地图,然后将材料拖动到PS层中,命名背景并调整大小。 然后复制原始图层的两层:蒙…

白色情人节恋人签名

白色情人节恋人签名

情人节,恋人,白色,电脑软件,我们必须互相亏欠。 我们想藕断丝连。 多么奇怪的世界,生活在深海的浮躁。 没有人因为人性的冷静天性而受到深深的拥抱。 风刮到北方,你就要走了。 我带着失去的腿向北跑去。 相似的人适合一起欢闹。 互补的人适合…

如何解决Word文档不能显示的问题

如何解决Word文档不能显示的问题

显示,文档,如何解决,电脑软件,Word,1,可能是由于在公共视图或大纲视图中工作。解决方案:在打印页面中查看页眉、页脚或图形对象的位置,切换到页面视图。 2,屏幕上的显示可能是链接的嵌入式图形的域代码。域代码是包含在指令字符域({ })。解决方法…

教你一个快速绘制可爱的可爱的青蛙

教你一个快速绘制可爱的可爱的青蛙

绘制,教你,可爱,青蛙,快速,本教程介绍如何使用可爱的可爱的青蛙克米特快速绘制AI,画出来的青蛙真可爱。教程很简单,就是利用人工智能的简单的形状和工具。我推荐给大家。希望你能喜欢。 本教程介绍如何使用可爱的可爱的青蛙克米特快速绘制AI…

代码运行时编辑器表单提交

代码运行时编辑器表单提交

运行,表单提交,编辑器,代码,电脑软件,复制代码代码如下所示: 对于(在FCKeditorAPI。实例变量名){ 无功oeditor = {姓名} FCKeditorAPI。实例; 如果(oeditor.getparentform oeditor.getparentform()= =这) OEditor.UpdateLinkedField(); }…

ps如何绘制虚线PS的几种方法

ps如何绘制虚线PS的几种方法

绘制,虚线,几种方法,电脑软件,ps,ps怎么画虚线,在PS图象处理软件画虚线,主要使用PS笔刷工具,有几种方法来实现它。这里有几种绘制ps虚线的方法。让我们看一看。 PS图象处理软件画通常是一条线,所以如何使用PS画虚线然后PS如何画一条虚拟线,这里…

PS图象处理软件使用图层样式制作可

PS图象处理软件使用图层样式制作可

软件使用,图象处理,图层,质感,样式,本教程介绍了一种非常透明的制作宝石质量按钮的方法。一般过程:首先使用一个选择工具来制作所需的形状,颜色在若干层数之后使纹理和纹理效果。然后添加高光和文本。 最终效果 1,打开背景材料,如下图所示。 …

PS做一个柔软滑滑的字体特效。

PS做一个柔软滑滑的字体特效。

字体,做一个,柔软,特效,电脑软件,本教程主要是向朋友介绍ps,制作细腻流畅的字体效果的方法。教程制作的文本非常可爱和漂亮,难度也不是很大。建议你喜欢你的朋友一起学习。 本教程主要是向朋友介绍PS制作细腻滑滑字体效果的方法。在这个过程…

PHP随机选择数组中的几个非重复元

PHP随机选择数组中的几个非重复元

重复元素,选择,几个,组中,电脑软件,本文阐述了PHP从数组中随机选择几个不重复元素的方法,供大家参考,具体实现方法如下: 复制代码代码如下: * *数组=要筛选的数组 *总计=返回的最大项目数 *唯一=是否在获得随机列表之前删除重复项 * / …

PS图象处理软件制作的恢宏大气的彩

PS图象处理软件制作的恢宏大气的彩

图象,大气,处理软件,海报,彩色,贴图的效果确实很漂亮,里面的材质基本上是彩色的,所以你需要尝试多重纹理,在保持漂亮画面的同时不要太过凌乱。 贴图的效果确实很漂亮,里面的材质基本上是彩色的,所以你需要尝试多重纹理,在保持漂亮画面的同时不要…

AI制作逼真的牛仔帆布纹理

AI制作逼真的牛仔帆布纹理

纹理,帆布,逼真,牛仔,电脑软件,本教程是介绍给一个朋友,利用人工智能创建逼真的牛仔帆布纹理的过程。教程制作的牛仔布质地逼真,难度不大。推荐给你的朋友。 本教程中的AI学习者使用人工智能创建逼真的牛仔画布纹理。这个教程通常很难。牛仔…

PS图象处理软件风格的程序格过滤器

PS图象处理软件风格的程序格过滤器

图标,过滤器,图象,丰富多彩,处理软件,使用PS图象处理软件创建颜色网格图标,本教程使用智能对象和智能滤镜,你将学习智能过滤器的强大效应。 使用PS图象处理软件创建颜色网格图标,本教程使用智能对象和智能滤镜,你将学习智能过滤器的强大影响。…