摘要:什么是策略模式說(shuō)到設(shè)計(jì)模式一般人像我一樣的新鳥(niǎo)們首先想到的是單例模式哇單例模式又是什么假設(shè)有個(gè)需求有四種計(jì)算方法輸出輸入其中使用單例模式如下這么做的話會(huì)保證一個(gè)類僅有一個(gè)實(shí)例并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)但是問(wèn)題來(lái)了如果我有成百上千的方法會(huì)特
什么是策略模式?
說(shuō)到設(shè)計(jì)模式, 一般人(像我一樣的新鳥(niǎo)們)首先想到的是單例模式!. 哇, 單例模式又是什么? ....^&^%^
假設(shè)有個(gè)需求: 有A,B,C,D四種計(jì)算方法, y(輸出) = x(輸入) * n, 其中A(n=2),B(n=4),C(n=6),D(n=8).
使用單例模式如下:
var obj = (function() { var logA = function(x) { console.log(x * 2); }; var logB = function(x) { console.log(x * 4); }; var logC = function(x) { console.log(x * 6); }; var logD = function(x) { console.log(x * 8); }; return { logA: logA, logB: logB, logC: logC, logD: logD, } })(); obj.logA(2); // 4 // 這么做的話, 會(huì)保證一個(gè)類僅有一個(gè)實(shí)例, 并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn).
但是問(wèn)題來(lái)了, 如果我有成百上千的方法, 會(huì)特別難維護(hù).正式介紹策略模式
定義: 定義一系列的算法, 把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可以相互替換.
不太懂?沒(méi)關(guān)系, 先上代碼!
var logTypes = { A: function(x) { console.log(x * 2); }, B: function(x) { console.log(x * 4); }, C: function(x) { console.log(x * 6); }, D: function(x) { console.log(x * 8); }, }; var log = function(type, x) { logTypes[type](x); }; log("A", 20); // 40
有什么區(qū)別? 就只是多了個(gè)入口, 但是我們真正內(nèi)部方法會(huì)被封裝起來(lái), 使用的時(shí)候交給log函數(shù), 它就負(fù)責(zé)托管, 負(fù)責(zé)計(jì)算的邏輯放在頂部logTypes中.
所以策略模式的關(guān)鍵在于托管, 一個(gè)派發(fā)器, 分發(fā)給不同的算法.(類似redux)
讓我們優(yōu)雅地讓div亂飛吧!
動(dòng)畫方法分析各種動(dòng)畫運(yùn)動(dòng)函數(shù), tween對(duì)象
初始化目標(biāo)位置和信息, Animate類(假裝是個(gè)類)
因?yàn)榛诓呗阅J? 需要有一個(gè)托管入口, start函數(shù)
動(dòng)畫是一幀一幀組成的, 所以還需要一個(gè)step函數(shù)來(lái)計(jì)算每一幀
最后進(jìn)行dom操作, 需要update函數(shù)
代碼來(lái)了~/** * @desc 定義一系列算法, 均接收4個(gè)參數(shù) * @param t 動(dòng)畫已消耗的時(shí)間 * @param b 小球原始的位置 * @param c 小球的目標(biāo)位置 * @param d 動(dòng)畫持續(xù)的總時(shí)間 */ var tween = { 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; }, } /** * @desc Animate類 */ var Animate = function(dom) { this.dom = dom; this.startTime = 0; this.startPos = 0; // 運(yùn)動(dòng)開(kāi)始時(shí)候dom初始位置 this.endPos = 0; // 目標(biāo)位置 this.propertyName = null; // dom節(jié)點(diǎn)需要被改變的css屬性名 this.easing = null; // 緩動(dòng)算法 this.duration = null; // 持續(xù)時(shí)間 }; /** * @desc 在Animate原型上添加start方法, 啟動(dòng)動(dòng)畫 * @param propertyName 要改變的css屬性名, 如: left * @param endPos 小球運(yùn)動(dòng)的目標(biāo)位置 * @param duration 動(dòng)畫持續(xù)時(shí)間 * @param easing 緩動(dòng)算法 */ Animate.prototype.start = function(propertyName, endPos, duration, easing) { this.startTime = +new Date; // 動(dòng)畫啟動(dòng)時(shí)間 this.startPos = this.dom.getBoundingClientRect()[propertyName]; this.propertyName = propertyName; this.endPos = endPos; this.duration = duration; this.easing = tween[easing]; var self = this; var timeId = setInterval(function() { if (self.step() === false) { clearInterval(timeId); } }, 19); }; /** * @desc 小球運(yùn)動(dòng)每一幀需要做的事情 */ Animate.prototype.step = function() { var t = +new Date; // 取得當(dāng)前時(shí)間 if (t >= this.startTime + this.duration) { this.update(this.endPos); // 更新小球的css屬性值 return false; } var pos = this.easing(t - this.startTime, this.startPos, this.endPos - this.startPos, this.duration); // pos為小球當(dāng)前位置 this.update(pos); } /** * @desc 操作dom, 改變小球位置 */ Animate.prototype.update = function(pos) { this.dom.style[this.propertyName] = pos + "px"; }
部分代碼參考 <>
源碼地址: github
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/98047.html
摘要:策略模式策略模式指的是定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),將不變的部分和變化的部分隔開(kāi),實(shí)際就是將算法的使用和實(shí)現(xiàn)分離出來(lái)這樣就能避免很多的條件判斷并且增強(qiáng)了代碼的復(fù)用性其中包含一個(gè)策略類和一個(gè)環(huán)境類計(jì)算獎(jiǎng)金的例子策略類環(huán)境類設(shè)置原始工 策略模式 策略模式指的是 定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),將不變的部分和變化的部分隔開(kāi),實(shí)際就是將算法的使用和實(shí)現(xiàn)分離出來(lái), 這樣就能避...
摘要:將不變的部分和變化的部分隔開(kāi)是每個(gè)設(shè)計(jì)模式的主題,策略模式也不例外,策略模式的目的就是將算法的使用與算法的實(shí)現(xiàn)分離開(kāi)來(lái)。 前言 本系列文章主要根據(jù)《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》整理而來(lái),其中會(huì)加入了一些自己的思考。希望對(duì)大家有所幫助。 文章系列 js設(shè)計(jì)模式--單例模式 js設(shè)計(jì)模式--策略模式 js設(shè)計(jì)模式--代理模式 概念 策略模式的定義是:定義一系列的算法,把它們一個(gè)...
摘要:個(gè)人前端文章整理從最開(kāi)始萌生寫文章的想法,到著手開(kāi)始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開(kāi)始萌生寫文章的想法,到著手...
閱讀 2913·2023-04-26 02:14
閱讀 3766·2019-08-30 15:55
閱讀 1848·2019-08-29 16:42
閱讀 2764·2019-08-26 11:55
閱讀 2852·2019-08-23 13:38
閱讀 492·2019-08-23 12:10
閱讀 1318·2019-08-23 11:44
閱讀 2813·2019-08-23 11:43