美文网首页
策略模式

策略模式

作者: 言叶丶 | 来源:发表于2017-02-20 17:29 被阅读0次
定义

定义一系列算法, 把他们一个个封装起来,并且能够相互替换。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式的目的就是将算法的使用与算法的实现分离开来

策略模式实现表单验证
<form action="http:// xxx.com/register" id="registerForm" method="post">
    请输入用户名:<input type="text" name="userName"/ >
    请输入密码:<input type="text" name="password"/ >
    请输入手机号码:<input type="text" name="phoneNumber"/ >
    <button>提交</button>
</form>
    ...
<script type="text/javascript">
    var registerForm = document.getElementById('registerForm');

    var strategies = {
        'isNotEmpty': function (val, error) {
            if (val == "") {
                this.focus();
                return error;
            }
        },
        'minLength': function (val, error, length) {
            if (val.length < length) {
                this.focus();
                return error;
            }
        },
        'isMobile': function (val, error) {
            if (!/(^1[3|5|8][0-9]{9}$)/.test(val)) {
                this.focus();
                return error;
            }
        }
    };

    var validataFn = function () {

        var validator = new Validator();

        /*添加规则*/
        validator.add( registerForm.userName, [{
                strategy: 'isNotEmpty',
                errorMsg: '用户名不能为空'
            }, {
                strategy: 'minLength:6',
                errorMsg: '用户名长度不能小于 10 位'
            }] 
        );

        var errMsg = validator.start();

        return errMsg;
    }

    function Validator () { 
        this.cache = [];
    }

    /**
     * @params: dom表示表单元素,rule: {strategy: 验证规则, errMsg: 错误信息}
     * 用于将验证函数添加到数组中
     */
    Validator.prototype.add = function (dom, rule) {
        var self = this;
        
        rule.map(function (val, n) {
            var arrs = [];
            arrs = val.strategy.split(':');
            var strategy = arrs.shift();
            arrs.unshift(val.errorMsg);
            arrs.unshift(dom.value);
            self.cache.push(function(){
                return strategies[strategy].apply(dom, arrs);
            });
        })
    }

    /**
     * 用于返回第一个验证的错误信息
     */
    Validator.prototype.start = function () {
        console.log(this.cache[1]());
        for (var i = 0, fn; fn = this.cache[i++];) {
            var err = fn();
            if(err) {
                return err;
            }
        }
    }

    registerForm.onsubmit = function () {
        var err = validataFn();
        if (err) {
            alert(err);
        }
        return false;
    }
</script>
策略模式的优缺点
优点
  1. 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句
  2. 策略模式提供了对开放 — 封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展
  3. 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
  4. 在策略模式中利用组合和委托来让 Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案
缺点

使用策略模式会在程序中增加许多策略类或者策略对象。其次,要使用策略模式,必须了解所有的 strategy ,必须了解各个 strategy 之间的不同点,
这样才能选择一个合适的 strategy 。

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/xfhewttx.html