摘要:策略模式策略模式指的是定义一系列的算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,实际就是将算法的使用和实现分离出来这样就能避免很多的条件判断并且增强了代码的复用性其中包含一个策略类和一个环境类计算奖金的例子策略类环境类设置原始工
策略模式
策略模式指的是 定义一系列的算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,实际就是将算法的使用和实现分离出来, 这样就能避免很多的if 条件判断, 并且增强了代码的复用性;
其中包含一个策略类, 和一个环境类;
计算奖金的例子:
// 策略类 var performanceS = function () {} performanceS.prototype.calculate = function (salary) { return salary * 4; } var performanceA = function () {} performanceA.prototype.calculate = function (salary) { return salary * 3; } var performanceB = function () { } performanceB.prototype.calculate = function (salary) { return salary * 2; } // 环境类 var Bonus = function () { this.salary = null; this.strategy = null; } Bonus.prototype.setSalary = function (salary) { this.salary = salary; } Bonus.prototype.setStrategy = function (strategy) { this.strategy = strategy; } Bonus.prototype.getBonus = function () { return this.strategy.calculate(this.salary); } var bonus = new Bonus(); bonus.setSalary(1000); // 设置原始工资 bonus.setStrategy(new performanceS()); // 设置策略对象 console.log(bonus.getBonus());
缓动动画
// 策略类 var tween = { /** * 缓动动画 * @param t 已消耗的时间 * @param b 小球的原始位置 * @param c 小球的目标位置 * @param d 动画持续的总时间 * @return {*} */ linear: function (t, b, c, d) { return c * t / d + b; }, easeIn: function (t, b, c, d) { return c * (t /= d) * t + b; }, strongEaseIn: function (t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, strongEaseOut: function (t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; }, sineaseIn: function (t, b, c, d) { return c * (t /= d) * t * t + b; }, sineaseOut: function (t, b, c, d) { return c * ((t = t / d -1) * t * t + 1) + b; } } // 环境类 var Animate = function (dom) { this.dom = dom; this.startTime = 0; this.startPos = 0; this.endPos = 0; this.propertyName = null; this.easing = null; this.duration = null; } /** * 启动动画 * @param propertyName 属性 * @param endPose 结束位置 * @param duration 持续时间 * @param easing 缓动算法 */ Animate.prototype.start = function (propertyName, endPose, duration, easing) { this.startTime = +new Date(); this.startPos = this.dom.getBoundingClientRect()[propertyName]; // dom 节点初始位置 this.propertyName = propertyName; this.endPos = endPose; this.duration = duration; this.easing = tween[easing]; var self = this; var timerId = setInterval(function () { if (self.step() === false) { clearInterval(timerId); } }, 19); } // 每 19 毫秒就执行 一次 Animate.prototype.step = function () { var t = +new Date(); if (t > this.startTime + this.duration) { this.update(this.endPos); return false; } var pos = this.easing( t - this.startTime, this.startPos, this.endPos - this.startPos, this.duration ); this.update(pos); } Animate.prototype.update = function (pos) { this.dom.style[this.propertyName] = pos + "px"; } var div = document.getElementById("div"); var animate = new Animate(div); // animate.start("left", 1500, 5000, "linear"); // animate.start("left", 1500, 5000, "easeIn"); // animate.start("left", 1500, 5000, "strongEaseIn"); animate.start("left", 1500, 5000, "strongEaseOut"); // animate.start("left", 1500, 5000, "sineaseIn"); // animate.start("left", 1500, 5000, "sineaseOut"); // animate.start("top", 1500, 5000, "linear"); // animate.start("top", 1500, 5000, "easeIn"); // animate.start("top", 1500, 5000, "strongEaseIn"); // animate.start("top", 1500, 5000, "strongEaseOut"); // animate.start("top", 1500, 5000, "sineaseIn"); // animate.start("top", 1500, 5000, "sineaseOut");
表单校验
// 策略类 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(":"); this.cache.push(function () { var strategy = ary.shift(); // 删除并返回数据第一个元素 ary.unshift(dom.value); // 向数组的开头添加一个或更多元素,并返回新的长度 ary.push(errorMsg); return strategies[strategy].apply(dom, ary); }); } Validator.prototype.start = function () { for (var i = 0, validatorFunc; validatorFunc = this.cache[i++];) { console.log(validatorFunc = this.cache[i++]); var msg = validatorFunc(); if (msg) { return msg; } } } var validatorFunc = function () { var validator = new Validator(); validator.add(registerForm.userName, "isNonEmpty", "用户名不能为空"); validator.add(registerForm.password, "minLength:6", "密码长度不能少于6位"); validator.add(registerForm.phoneNumber, "isMobile", "手机号码格式不正确"); return validator.start(); } var registerForm = document.getElementById("registerForm"); registerForm.onsubmit = function () { var errorMsg = validatorFunc(); if (errorMsg) { alert(errorMsg); return false; } }
以上的代码都是在我的github上可以看到
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/102913.html
摘要:设计模式与开发实践读书笔记。策略模式可以有效避免多重条件选择语句。当然,策略模式也有一些缺点增加了许多策略类或者策略对象。要使用策略模式,必须了解所有的,违反了最少知识原则。至此,回家咯附设计模式之发布订阅模式观察者模式 《JavaScript设计模式与开发实践》读书笔记。这本书挺好的,推荐。 俗话说,条条大路通罗马。在现实生活中,我们可以采用很多方法实现同一个目标。比如我们先定个小目...
摘要:策略模式可以避免代码中的多重判断条件。策略模式在程序中或多或少的增加了策略类。此文仅记录本人阅读设计模式与开发实践这个本时的感受,感谢作者曾探写出这么好的一本书。设计模式中很重要的一点就是将不变和变分离出来。参考设计模式与开发实践曾探 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-...
阅读 3016·2023-04-26 00:32
阅读 498·2019-08-30 15:52
阅读 2104·2019-08-30 15:52
阅读 3346·2019-08-30 15:44
阅读 3279·2019-08-30 14:09
阅读 1415·2019-08-29 15:15
阅读 3389·2019-08-28 18:12
阅读 1073·2019-08-26 13:55