最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Javascript 设计模式 - 策略模式

    正文概述 掘金(alanyf)   2020-12-09   570

    举例

    • 表单校验:执行校验规则校验规则配置分开;
    • 前端动画类:将渲染动画动画配置以及动画控制分开

    策略模式演示:表单校验

    // 校验方法&规则配置
    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 strategy = ary.shift(); // 用户挑选的strategy
            ary.unshift( dom.value ); // 把input 的value 添加进参数列表
            ary.push( errorMsg ); // 把errorMsg 添加进参数列表
            return strategies[ strategy ].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(); // 如果errorMsg 有确切的返回值,说明未通过校验
        if ( errorMsg ){
            alert ( errorMsg );
            return false; // 阻止表单提交
        }
    };
    

    优点

    策略模式是一种常用且有效的设计模式,总结一下策略模式的一些优点:

    • 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。
    • 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展。
    • 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
    • 在策略模式中利用组合和委托来让 Context 拥有执行算法的能力,这也是继承的一种更轻便的替代方案。

    缺点

    策略模式也有一些缺点,但这些缺点并不严重:

    • 使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的 逻辑堆砌在 Context 中要好。
    • 要使用策略模式,必须了解所有的 strategy,必须了解各个 strategy 之间的不同点, 这样才能选择一个合适的 strategy。比如,我们要选择一种合适的旅游出行路线,必须先了解选 择飞机、火车、自行车等方案的细节。此时 strategy 要向客户暴露它的所有实现,这是违反最少 知识原则的。

    总结

    不仅是算法,业务规则指向的目标一致,并且可以被替换使用,就也可以用策略模式来封装它们。

    “在函数作为一等对象的语言中,策略模式是隐形的。 strategy 就是值为函数的变量。”

    相对传统面向对象语言的方式实现策略模式,使用 JavaScript 语言的策略模式,策略类往往被函数所代替,这时策略模式就 成为一种“隐形”的模式。

    参考

    JavaScript设计模式与开发实践


    起源地下载网 » Javascript 设计模式 - 策略模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元