策略模式支持在运行时由使用者选择合适的算法,对于使用者而言不用关心背后的具体事项,而使用者自动根据当前程序执行的上下文和配置,从已有的算法列表中选择出合适的算法来处理当前任务。
1.要解决的问题
2.如何实现
3.在开源框架和类库中的使用
4.总结
要解决的问题
策略模式同样解决的是解耦的问题,目的是使调用的客户端与需要调用的算法解耦开来,保证算法的内部实现的更改不会影响到客户端的调用。当然这些算法往往需要封装为较为通用的。这样一来可以自由的从算法几种选取需要调用的合适的算法,就像搭积木一样,而算法也可以独立出来单测。
如何实现(应用场景之一表单验证)
对于一个表单,各个字段的输入值格式并不唯一,有的是数字,有的是电话号码。因而他们可能有各自都有的验证的要求。
策略模式是可复用的,比如多个字段可能都要求验证非空,这时,我们可以把场景的验证策略抽象为一个策略集合
使用者需要对表单数据进行校验时,只需要传入数据以及制定各个字段的验证策略,就可以给出相应的验证结果了,从而将表达你的处理和验证逻辑分离开来。
方法
validator.types = { isNotEmpty: { validate: function(value){ return value !== ""; }, message: "不得为空" }, isNotEqualTo: { validate: function(data, curField, compareField){ return data[curField] === data[compareField]; }, message: function(fieldText){ return "不得与" + fieldText + "相同,请重新输入"; } }, isValidName: { validate: function(value){ return (/^[\u4e00-\u9fa5]{2,4}$/).test(value); }, message: "只能为2-4个字的汉字" }, isValidIdentity: { validate: function(value){ return (/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i).test(value); }, message: "不合法,请输入身份证上的18位身份证号" }, isBirthEqualTo: { validate: function(data, curField, compareField){ return data[curField].replace(/-/g, '') === data[compareField].substr(6, 8); }, message: function(fieldText){ return "与" + fieldText + "中生日不一致,请修改"; } }, isValidDate: { validate: function(value){ var t = new Date(value), paddingZero = function(value){ return value < 10 ? ('0' + value) : value; }, transStr = [t.getFullYear(), paddingZero(t.getMonth() + 1), paddingZero(t.getDate())].join('-'); return transStr === value; }, message: '格式不合法,请按"2008-01-01"格式输入日期' }, isValidMobile: { validate: function(value){ return (/^0?(13[0-9]|15[012356789]|18[02356789]|14[57])[0-9]{8}$/).test(value); }, message: "格式不合法,请输入正确的手机号码" }, isValidEmail: { validate: function(value){ return (/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/).test(value); }, message: "格式不合法,请输入正确的Email地址" } };