JavaScript设计模式(策略模式)

1. 策略模式的定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

let strategies = {
    "S": function (salary) {
        return salary * 4;
    },
    "A": function (salary) {
        return salary * 3;
    },
    "B": function (salary) {
        return salary * 2;
    }
};

let calculateBonus = function (level, salary) {
    return strategies[level](salary);
};

console.log(calculateBonus('S', 20000));     // 输出:80000 console.log( calculateBonus( 'A', 10000 ) );     // 输出:30000

2. 场景

2.1 表单校验

<html>

<body>
    <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>

        /***********************策略对象**************************/

        let 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 类**************************/

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

        Validator.prototype.add = function (dom, rules) {

            let self = this;

            for (let i = 0, rule; rule = rules[i++];) {
                (function (rule) {
                    let strategyAry = rule.strategy.split(':');
                    let errorMsg = rule.errorMsg;

                    self.cache.push(function () {
                        let strategy = strategyAry.shift();
                        strategyAry.unshift(dom.value);
                        strategyAry.push(errorMsg);
                        return strategies[strategy].apply(dom, strategyAry);
                    });
                })(rule)
            }

        };

        Validator.prototype.start = function () {
            for (let i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
                let errorMsg = validatorFunc();
                if (errorMsg) {
                    return errorMsg;
                }
            }
        };

        /***********************客户调用代码**************************/

        let registerForm = document.getElementById('registerForm');

        let validataFunc = function () {
            let validator = new Validator();

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

            validator.add(registerForm.password, [{
                strategy: 'minLength:6',
                errorMsg: '密码长度不能小于 6位'
            }]);

            validator.add(registerForm.phoneNumber, [{
                strategy: 'isMobile',
                errorMsg: '手机号码格式不正确'
            }]);

            let errorMsg = validator.start();
            return errorMsg;
        }

        registerForm.onsubmit = function () {
            let errorMsg = validataFunc();

            if (errorMsg) {
                alert(errorMsg);
                return false;
            }
        };


    </script>
</body>

</html>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容