策略模式支持在运行时由使用者选择合适的算法,对于使用者而言不用关心背后的具体事项,而使用者自动根据当前程序执行的上下文和配置,从已有的算法列表中选择出合适的算法来处理当前任务。

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地址"
    }

};
View Code

相关文章: