设计模式2-策略模式

本文介绍了如何运用策略模式来增强JavaScript表单的校验功能。通过定义不同的校验策略如非空、最小长度和手机号码格式,创建了一个Validator类,该类可以动态组合校验规则并逐个执行,提高了代码的可维护性和灵活性。在加强版中,允许为每个输入字段指定多个校验规则,进一步增强了表单验证的能力。
摘要由CSDN通过智能技术生成

策略模式

应用场景:表单校验

	<form id="registerForm">
        用户名:<input type="text" name="userName" />
        密码:<input type="text" name="password" />
        手机号:<input type="text" name="phoneNumber" />
        <button type="submit">提交</button>
    </form>
    <script>
        // 校验方法
        var strategies = {
            isNonEmpty: function(value,errorMsg){
                if(value===''){
                    return errorMsg
                }
            },
            minLength: function(value,length,errorMsg){
                if(value.length<length){
                    return errorMsg
                }
            },
            isMobile: function(value,errorMsg){
                if(!(/(^1[3|5|8][0-9]{9}$)/).test(value)){
                    return errorMsg
                }
            },
        }
        var Validator = function(){
            this.cache=[]
        }
        Validator.prototype.add=function(dom,rule,errorMsg){
            var ary=rule.split(':') // 把strategy和参数分开
            this.cache.push(function(){ //  把校验步骤用空函数包装起来,并且放入cache
                var prop=ary.shift() // 用户挑选的strategy
                ary.unshift(dom.value)  //把input的value添加进参数列表
                ary.push(errorMsg)  // 把errorMsg添加进参数列表
                return strategies[prop].apply(dom,ary)
            })
        }
        Validator.prototype.start=function(){
            for(var i=0,validatorFunc;validatorFunc=this.cache[i++];){
                var msg=validatorFunc(); //开始校验,并取得校验后的返回信息
                if(msg){ // 如果有确切的返回值,说明校验没有通过
                    return msg
                }
            }
        }
        var validataFunc=function(){
            var validator=new Validator() //创建一个validator对象
            // 添加一些校验规则
            validator.add(registerForm.userName,'isNonEmpty','用户名不能为空')
            validator.add(registerForm.password,'minLength:6','密码长度不能少于6位')
            validator.add(registerForm.phoneNumber,'isMobile','手机号码格式不正确')
            var errorMsg = validator.start() //获得校验结果
            return errorMsg         //返回校验结果
        }
        var registerForm = document.getElementById('registerForm');
        registerForm.onsubmit=function(){
            var errorMsg=validataFunc();
            if(errorMsg){
                alert(errorMsg);
                return false; // 阻止表单提交
            }
        }
    </script>

加强版表单校验

		/***************策略类********************/
        var strategies = {
            isNonEmpty: function(value,errorMsg){
                if(value===''){
                    return errorMsg
                }
            },
            minLength: function(value,length,errorMsg){
                if(value.length<length){
                    return errorMsg
                }
            },
            isMobile: function(value,errorMsg){
                if(!(/(^1[3|5|8][0-9]{9}$)/).test(value)){
                    return errorMsg
                }
            },
        }
        /***************validator类********************/
        var Validator = function(){
            this.cache=[]
        }
        Validator.prototype.add=function(dom,rules){
            var self=this
            for(var i=0,rule;rule=rules[i++];){
                (function(rule){
                    var ary=rule.strategy.split(':') // 把strategy和参数分开
                    self.cache.push(function(){ //  把校验步骤用空函数包装起来,并且放入cache
                        var prop=ary.shift() // 用户挑选的strategy
                        ary.unshift(dom.value)  //把input的value添加进参数列表
                        ary.push(rule.errorMsg)  // 把errorMsg添加进参数列表
                        return strategies[prop].apply(dom,ary)
                    })
                })(rule)
            }    
        }
        Validator.prototype.start=function(){
            for(var i=0,validatorFunc;validatorFunc=this.cache[i++];){
                var msg=validatorFunc(); //开始校验,并取得校验后的返回信息
                if(msg){ // 如果有确切的返回值,说明校验没有通过
                    return msg
                }
            }
        }
        /***************客户调用代码********************/
        var validataFunc=function(){
            var validator=new Validator() //创建一个validator对象
            // 添加一些校验规则
            validator.add(registerForm.userName,[
                { strategy: 'isNonEmpty', errorMsg: '用户名不能为空' },
                { strategy: 'minLength:10', errorMsg: '用户名长度不能小于10位' }
            ])
            validator.add(registerForm.password,[
                { strategy: 'minLength:6', errorMsg: '密码长度不能少于6位' }
            ])
            validator.add(registerForm.phoneNumber,[
                { strategy: 'isMobile', errorMsg: '手机号码格式不正确' }
            ])
            var errorMsg = validator.start() //获得校验结果
            return errorMsg         //返回校验结果
        }
        var registerForm = document.getElementById('registerForm');
        registerForm.onsubmit=function(){
            var errorMsg=validataFunc();
            if(errorMsg){
                alert(errorMsg);
                return false; // 阻止表单提交
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值