摘要:一策略模式定義把一些小的算法封裝起來(lái)使他們之間可以相互替換把代碼的實(shí)現(xiàn)和使用分離開(kāi)來(lái)利用策略模式實(shí)現(xiàn)小方塊緩動(dòng)代碼代碼動(dòng)畫(huà)已消耗時(shí)間原始位置目標(biāo)位置持續(xù)時(shí)間小球運(yùn)動(dòng)的時(shí)間要改變的屬性例如緩動(dòng)算法記錄開(kāi)始位置并設(shè)置定時(shí)器是否有要執(zhí)行的
一.策略模式
1.定義:把一些小的算法,封裝起來(lái),使他們之間可以相互替換(把代碼的實(shí)現(xiàn)和使用分離開(kāi)來(lái))
2.利用策略模式實(shí)現(xiàn)小方塊緩動(dòng)
html代碼:
js代碼:
var container = document.getElementById("container"); container.style.height = window.innerHeight +"px"; var tween = {//t動(dòng)畫(huà)已消耗時(shí)間、b原始位置、c目標(biāo)位置、d持續(xù)時(shí)間 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.duration = 0;//小球運(yùn)動(dòng)的時(shí)間 this.propertyName = null;//要改變的css屬性,例如top,left this.easing=null;//緩動(dòng)算法 }; animate.prototype.start = function(endPos,duration,propertyName,easing){ //記錄開(kāi)始位置,并設(shè)置定時(shí)器是否有要執(zhí)行的步數(shù) this.startTime = new Date(); this.startPos = this.dom.getBoundingClientRect()[propertyName]; this.endPos = endPos; this.duration = duration; this.propertyName = propertyName; this.easing = tween[easing]; var setTime = setInterval(function(){ if(this.step()){ clearsetInterval(setTime); } this.step(); }.bind(this),20) } animate.prototype.step = function(){//動(dòng)畫(huà)執(zhí)行一步需要的操作 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.duration);//t動(dòng)畫(huà)已消耗時(shí)間、b原始位置、c目標(biāo)位置、d持續(xù)時(shí)間 this.update(pos); } animate.prototype.update = function(pos){//更新div的css屬性 if(pos > window.innerWidth || pos>window.innerHeight){ this.dom.style[this.propertyName] = this.endPos +"px"; return false; } this.dom.style[this.propertyName] = pos +"px"; } //調(diào)用 var move = document.getElementById("move"); var a = new animate(move); a.start(100,1000,"bottom","sineaseIn")
3.優(yōu)缺點(diǎn)
優(yōu)點(diǎn):避免多重條件判斷語(yǔ)句;遵循開(kāi)放-封閉原則,具有較好的擴(kuò)展性,便于切換;可復(fù)用性;
缺點(diǎn):違背最少知識(shí)原則(向用戶暴露所有的實(shí)現(xiàn))
1.定義:允許一個(gè)對(duì)象在其狀態(tài)改變時(shí)改變他的行為,對(duì)象看起來(lái)視乎修改了他的類
2.狀態(tài)模式例子:電源開(kāi)關(guān)三種狀態(tài)的互相變化(狀態(tài)驅(qū)動(dòng)行為)
var Light = function(){ this.offState = new offLightState(this); this.weakState = new weakLightState(this); this.strongState = new strongLightState(this); this.button = null; } Light.prototype.start = function(){ this.button = document.getElementById("change"); this.current = this.offState; this.button.onclick = function(){ this.current.btnPressed(); }.bind(this); } Light.prototype.setState = function(newState){//改變狀態(tài) this.current = newState; } //狀態(tài)模式的關(guān)鍵是把每種狀態(tài)都封裝成一個(gè)類 var offLightState = function(light){ this.light = light; }; offLightState.prototype.btnPressed = function(){ console.log("調(diào)弱"); this.light.setState(this.light.weakState); } var weakLightState = function(light){ this.light = light; }; weakLightState.prototype.btnPressed = function(){ console.log("調(diào)強(qiáng)"); this.light.setState(this.light.strongState); } var strongLightState = function(light){ this.light = light; }; strongLightState.prototype.btnPressed = function(){ console.log("關(guān)閉"); this.light.setState(this.light.offState); } var light = new Light(); light.start();//調(diào)弱 調(diào)強(qiáng) 關(guān)閉
3.狀態(tài)模式是狀態(tài)機(jī)的一種實(shí)現(xiàn)方式,還可以直接將狀態(tài)委托給字面量,利用Function.prototype.call()調(diào)用,達(dá)到和狀態(tài)模式一樣的效果
var FMC = { on:{ buttonWasPressed:function(){ console.log("變?nèi)?) this.current = FMC.weak; } }, weak:{ buttonWasPressed:function(){ console.log("變強(qiáng)") this.current = FMC.strong; } }, strong:{ buttonWasPressed:function(){ console.log("變更強(qiáng)") this.current = FMC.superstrong; } }, superstrong:{ buttonWasPressed:function(){ console.log("關(guān)閉") this.current = FMC.off; } }, off:{ buttonWasPressed:function(){ console.log("打開(kāi)") this.current = FMC.on; } } } var light = function(){ this.current = FMC.off; this.button = null; } light.prototype.start = function(){ this.button = document.getElementById("change"); console.log("current",this.current) this.button.onclick = function(){ this.current.buttonWasPressed.call(this); }.bind(this); } var l = new light(); l.start();
4.優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可擴(kuò)展性較好,可以方便的增加新的狀態(tài);相比冗余的if else判斷,狀態(tài)模式將邏輯封裝在類中,避免Context無(wú)限膨脹
缺點(diǎn):代碼邏輯分散在各個(gè)類中,造成邏輯分散的問(wèn)題
相同點(diǎn):這兩種模式都只有一個(gè)上下文、一些策略類或者是狀態(tài)類,上下文把請(qǐng)求委托給這些類來(lái)執(zhí)行
不同點(diǎn):這兩種模式的目的是不同的;策略模式的策略類之間是相互平行平等的,而狀態(tài)模式的狀態(tài)類把狀態(tài)和行為封裝到一起,把邏輯實(shí)現(xiàn)封裝到類中,狀態(tài)之間的切換也早被規(guī)定完成.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/52434.html
摘要:一策略模式定義把一些小的算法封裝起來(lái)使他們之間可以相互替換把代碼的實(shí)現(xiàn)和使用分離開(kāi)來(lái)利用策略模式實(shí)現(xiàn)小方塊緩動(dòng)代碼代碼動(dòng)畫(huà)已消耗時(shí)間原始位置目標(biāo)位置持續(xù)時(shí)間小球運(yùn)動(dòng)的時(shí)間要改變的屬性例如緩動(dòng)算法記錄開(kāi)始位置并設(shè)置定時(shí)器是否有要執(zhí)行的 一.策略模式 1.定義:把一些小的算法,封裝起來(lái),使他們之間可以相互替換(把代碼的實(shí)現(xiàn)和使用分離開(kāi)來(lái))2.利用策略模式實(shí)現(xiàn)小方塊緩動(dòng) html代碼: ...
摘要:推文用設(shè)計(jì)模式解構(gòu)三國(guó)是一種什么體驗(yàn)行為型設(shè)計(jì)模式一策略模式工廠模式優(yōu)化結(jié)構(gòu)狀態(tài)模式隨著狀態(tài)改變而改變行為。推文狀態(tài)機(jī)與狀態(tài)模式責(zé)任鏈模式多個(gè)對(duì)象依次處理請(qǐng)求前者指定后者。代理模式代理針對(duì)一個(gè)對(duì)象,為了增加控制等中介雙方都是多個(gè),為了解耦。 策略模式 選擇使用封裝好的一系列算法,可相互替換。 類比:商店[Context]買完衣服買單[Stratege](現(xiàn)金[Concrete Stra...
摘要:抽象工廠模式將具有共同主題的對(duì)象工廠分組。對(duì)可重用性和可維護(hù)性設(shè)計(jì)模式的高層考慮創(chuàng)造性模式工廠方法模式也稱為虛擬構(gòu)造器意圖定義一個(gè)用于創(chuàng)建對(duì)象的接口,但讓子類決定實(shí)例化哪個(gè)類。 大綱 創(chuàng)造性模式 工廠方法模式創(chuàng)建對(duì)象而不指定要?jiǎng)?chuàng)建的確切類。 抽象工廠模式將具有共同主題的對(duì)象工廠分組。 Builder模式通過(guò)分離構(gòu)造和表示來(lái)構(gòu)造復(fù)雜的對(duì)象。 結(jié)構(gòu)模式 Bridge將抽象從其實(shí)現(xiàn)中分...
摘要:孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒(méi)噎死自己滾一邊去,我們這盤跟他賽馬開(kāi)始,策略模式上場(chǎng)。在設(shè)計(jì)模式之禪中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開(kāi)閉原則。 今天給大家說(shuō)說(shuō)田忌賽馬的故事。如有雷同,純屬巧合!話說(shuō)在戰(zhàn)國(guó)時(shí)期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂(lè)活動(dòng)的,其中賽馬是最火爆的。一天,孫臏看到田忌像個(gè)死雞似...
閱讀 1409·2019-08-30 15:44
閱讀 2182·2019-08-30 11:04
閱讀 582·2019-08-29 15:17
閱讀 2607·2019-08-26 12:12
閱讀 3189·2019-08-23 18:09
閱讀 975·2019-08-23 15:37
閱讀 1606·2019-08-23 14:43
閱讀 2996·2019-08-23 13:13