成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計模式之<策略模式>實現(xiàn)緩動動畫

岳光 / 499人閱讀

摘要:什么是策略模式說到設(shè)計模式一般人像我一樣的新鳥們首先想到的是單例模式哇單例模式又是什么假設(shè)有個需求有四種計算方法輸出輸入其中使用單例模式如下這么做的話會保證一個類僅有一個實例并提供一個訪問它的全局訪問點但是問題來了如果我有成百上千的方法會特

什么是策略模式?

說到設(shè)計模式, 一般人(像我一樣的新鳥們)首先想到的是單例模式!. 哇, 單例模式又是什么? ....^&^%^

假設(shè)有個需求: 有A,B,C,D四種計算方法, 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
// 這么做的話, 會保證一個類僅有一個實例, 并提供一個訪問它的全局訪問點.
但是問題來了, 如果我有成百上千的方法, 會特別難維護(hù).
正式介紹策略模式
定義: 定義一系列的算法, 把它們一個個封裝起來, 并且使它們可以相互替換.
不太懂?沒關(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ū)別? 就只是多了個入口, 但是我們真正內(nèi)部方法會被封裝起來, 使用的時候交給log函數(shù), 它就負(fù)責(zé)托管, 負(fù)責(zé)計算的邏輯放在頂部logTypes中.
所以策略模式的關(guān)鍵在于托管, 一個派發(fā)器, 分發(fā)給不同的算法.(類似redux)

基于策略模式實現(xiàn)緩動動畫

讓我們優(yōu)雅地讓div亂飛吧!

動畫方法分析

各種動畫運(yùn)動函數(shù), tween對象

初始化目標(biāo)位置和信息, Animate類(假裝是個類)

因為基于策略模式, 需要有一個托管入口, start函數(shù)

動畫是一幀一幀組成的, 所以還需要一個step函數(shù)來計算每一幀

最后進(jìn)行dom操作, 需要update函數(shù)

代碼來了~
/**
 * @desc 定義一系列算法, 均接收4個參數(shù)
 * @param t 動畫已消耗的時間
 * @param b 小球原始的位置
 * @param c 小球的目標(biāo)位置
 * @param d 動畫持續(xù)的總時間
 */
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)動開始時候dom初始位置
  this.endPos = 0; // 目標(biāo)位置
  this.propertyName = null; // dom節(jié)點需要被改變的css屬性名
  this.easing = null; // 緩動算法
  this.duration = null; // 持續(xù)時間
};

/**
 * @desc 在Animate原型上添加start方法, 啟動動畫
 * @param propertyName 要改變的css屬性名, 如: left
 * @param endPos 小球運(yùn)動的目標(biāo)位置
 * @param duration 動畫持續(xù)時間
 * @param easing 緩動算法
 */
Animate.prototype.start = function(propertyName, endPos, duration, easing) {
  this.startTime = +new Date; // 動畫啟動時間
  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)動每一幀需要做的事情
 */
Animate.prototype.step = function() {
  var t = +new Date; // 取得當(dāng)前時間
  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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98047.html

相關(guān)文章

  • javascript設(shè)計模式學(xué)習(xí)筆記策略模式

    摘要:策略模式策略模式指的是定義一系列的算法,把它們一個個封裝起來,將不變的部分和變化的部分隔開,實際就是將算法的使用和實現(xiàn)分離出來這樣就能避免很多的條件判斷并且增強(qiáng)了代碼的復(fù)用性其中包含一個策略類和一個環(huán)境類計算獎金的例子策略類環(huán)境類設(shè)置原始工 策略模式 策略模式指的是 定義一系列的算法,把它們一個個封裝起來,將不變的部分和變化的部分隔開,實際就是將算法的使用和實現(xiàn)分離出來, 這樣就能避...

    wh469012917 評論0 收藏0
  • js設(shè)計模式--策略模式

    摘要:將不變的部分和變化的部分隔開是每個設(shè)計模式的主題,策略模式也不例外,策略模式的目的就是將算法的使用與算法的實現(xiàn)分離開來。 前言 本系列文章主要根據(jù)《JavaScript設(shè)計模式與開發(fā)實踐》整理而來,其中會加入了一些自己的思考。希望對大家有所幫助。 文章系列 js設(shè)計模式--單例模式 js設(shè)計模式--策略模式 js設(shè)計模式--代理模式 概念 策略模式的定義是:定義一系列的算法,把它們一個...

    bigdevil_s 評論0 收藏0
  • 【連載】前端個人文章整理-從基礎(chǔ)到入門

    摘要:個人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個人前端文章整理 從最開始萌生寫文章的想法,到著手...

    madthumb 評論0 收藏0

發(fā)表評論

0條評論

岳光

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<