搜尋
首頁web前端js教程設計模式的策略模式如何在前端使用

這次帶給大家設計模式策略模式怎樣在前端使用,設計模式的策略模式在前端使用注意事項有哪些,下面就是實戰案例,一起來看看。

什麼是策略模式?在

GoF四兄弟的經典《設計模式》中,對策略模式的定義如下:

定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換。

上邊這句話,從字面來看很簡單。但是如何在開發過程中應用,僅憑一個定義依然是一頭霧水。以筆者曾經做過的商家進銷存系統為例:

某家超市準備舉辦促銷活動,市場人員經過調查分析制定了一些促銷策略:
  1. 購物滿100減10

  2. 購物滿200減30

  3. 購物滿300減50

  4. # #。 。 。

收銀軟體的介面是這樣的(簡單示意):設計模式的策略模式如何在前端使用

我們該如何計算實際消費金額?

最初的實作是這樣的:<pre class="brush:php;toolbar:false">//方便起见,我们把各个促销策略定义为枚举值:0,1,2... var getActualTotal = function(onSaleType,originTotal){     if(onSaleType===0){         return originTotal-Math.floor(originTotal/100)*10     }     if(onSaleType===1){         return originTotal-Math.floor(originTotal/200)*30     }     if(onSaleType===0){         return originTotal-Math.floor(originTotal/300)*50     } } getActualTotal(1,2680); //2208</pre>上面這段程式碼很簡單,而且缺點也很明顯。隨著我的滿減策略逐漸增多,getActualTotal函數會越變越大,而且充滿了

if

判斷,稍一疏忽就容易弄錯。

OK,有人說我很懶,雖然這樣不夠優雅但不影響我的使用,畢竟滿減策略再多也多不到哪裡去。
我只能說,需求永遠不是程式設計師定的。 。這時,市場人員說我們新版程式加入了會員功能,我們需要支援以下的促銷策略:
    會員促銷策略:
  1. 會員充300回60,且首單打9折
  2. 會員充500返100,且首單打8折
  3. 會員充1000回300,且首單打7折疊
  4. ...

這個時候,如果你還在原先的getActualTotal函數中繼續加上

if

判斷,我想如果你的領導者review你這段程式碼,可能會懷疑自己當初怎麼把你招進來。 。

OK,我們終於下定決心要重構促銷策略的程式碼,我們可以這麼做:

var vipPolicy_0=function(originTotal){
    return originTotal-Math.floor(originTotal/100)*10
}
var vipPolicy_1=function(originTotal){
    return originTotal-Math.floor(originTotal/200)*30
}
...
//会员充1000返300
var vipPolicy_10=function(account,originTotal){
    if(account===0){
        account+=1300;
        return originTotal*0.9
    }else{
        account+=1300;
        return originTotal;
    }
    return originTotal-Math.floor(originTotal/200)*30
}
...
var vipPolicy_n=function(){
    ...
}
var getActualTotal=function(onSaleType,originTotal,account){
    switch(onSaleType){
        case 0:
            return vipPolicy_0(originTotal);
        case 1:
            return vipPolicy_0(originTotal);
        ...
        case n:
            return ...
        default:
            return originTotal;
    }
}
    好了,現在我們每種策略都有自己獨立的空間了,看起來井井有條。但還有兩個問題沒有解決:
  1. 隨著促銷策略的增加,

    getActualTotal
  2. 的程式碼量依然會越來越大
  3. #系統缺乏彈性,如果需要增加一種策略,那麼除了加入一個策略函數,還需要修改

    switch...case..
  4. 語句

讓我們再來回顧一下策略模式的定義:

定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換

在我們的例子中,每種促銷策略的實現方式是不一樣的,但我們最終的目的都是為了求實際金額。策略模式可以把我們對促銷策略的演算法一個個封裝起來,並且使它們可互相替換而不影響我們對實際金額的求值,這正好是我們所需要的。

下面我們用策略模式來重構上面的程式碼:<pre class="brush:php;toolbar:false">var policies={     &quot;Type_0&quot;:function(originTotal){         return originTotal-Math.floor(originTotal/100)*10      },     &quot;Type_1&quot;:function(originTotal){         return originTotal-Math.floor(originTotal/200)*30      },     ...     &quot;Type_n&quot;:function(originTotal){         ...      } } var getActualTotal=function(onSaleType,originTotal,account){     return policies[&quot;Type_&quot;+onSaleType](originTotal,account) } //执行 getActualTotal(0,2680.00);//2208</pre>分析上面的程式碼我們發現,不管促銷策略如何增加,

getActualTotal

函數完全不需要再變化了。我們要做的,就是增加新策略的函數而已。 透過策略模式的程式碼,我們消除了讓人反胃的大片條件分支語句,

getActualTotal

本身並沒有計算能力,而是將計算全權委託給了策略函數。

    由此我們可以總結出策略模式實現的要點:
  1. ###將變化的演算法封裝成獨立的策略函數,並負責具體的計算####
  2. 委託函數,函數接受客戶請求,並將請求委託給某一個具體的策略函數

以UML圖表示如下:
設計模式的策略模式如何在前端使用

怎麼樣?現在看到上面這張圖是不是有了然於胸部的感覺?那就趕快去試試策略模式吧!


參考書籍:

  1. 《設計模式:可重複使用物件導向軟體的基礎》

  2. 《大話設計模式》

  3. #《Javascript設計模式與開發實踐》

做前端開發已經好幾年了,對設計模式一直沒有深入學習總結過。隨著架構相關的工作越來越多,越來越能感覺到設計模式成為了我前進道路上的阻礙。所以從今天開始深入學習和總結經典的設計模式以及物件導向的幾大原則。

今天第一天,首先來講策略模式。

什麼是策略模式?在

GoF四兄弟的經典《設計模式》中,對策略模式的定義如下:

定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換。

上邊這句話,從字面來看很簡單。但是如何在開發過程中應用,僅憑一個定義依然是一頭霧水。以筆者曾經做過的商家進銷存系統為例:

某家超市準備舉辦促銷活動,市場人員經過調查分析制定了一些促銷策略:
  1. 購物滿100減10

  2. 購物滿200減30

  3. 購物滿300減50

  4. # #。 。 。

收銀軟體的介面是這樣的(簡單示意):設計模式的策略模式如何在前端使用

我們該如何計算實際消費金額?

最初的實作是這樣的:<pre class="brush:php;toolbar:false">//方便起见,我们把各个促销策略定义为枚举值:0,1,2... var getActualTotal = function(onSaleType,originTotal){     if(onSaleType===0){         return originTotal-Math.floor(originTotal/100)*10     }     if(onSaleType===1){         return originTotal-Math.floor(originTotal/200)*30     }     if(onSaleType===0){         return originTotal-Math.floor(originTotal/300)*50     } } getActualTotal(1,2680); //2208</pre>上面這段程式碼很簡單,而且缺點也很明顯。隨著我的滿減策略逐漸增多,getActualTotal函數會越變越大,而且充滿了

if

判斷,稍一疏忽就容易弄錯。

OK,有人說我很懶,雖然這樣不夠優雅但不影響我的使用,畢竟滿減策略再多也多不到哪裡去。
我只能說,需求永遠不是程式設計師定的。 。這時,市場人員說我們新版程式加入了會員功能,我們需要支援以下的促銷策略:
    會員促銷策略:
  1. 會員充300回60,且首單打9折
  2. 會員充500返100,且首單打8折
  3. 會員充1000回300,且首單打7折疊
  4. ...

這個時候,如果你還在原先的getActualTotal函數中繼續加上

if

判斷,我想如果你的領導者review你這段程式碼,可能會懷疑自己當初怎麼把你招進來。 。

OK,我們終於下定決心要重構促銷策略的程式碼,我們可以這麼做:

var vipPolicy_0=function(originTotal){
    return originTotal-Math.floor(originTotal/100)*10
}
var vipPolicy_1=function(originTotal){
    return originTotal-Math.floor(originTotal/200)*30
}
...
//会员充1000返300
var vipPolicy_10=function(account,originTotal){
    if(account===0){
        account+=1300;
        return originTotal*0.9
    }else{
        account+=1300;
        return originTotal;
    }
    return originTotal-Math.floor(originTotal/200)*30
}
...
var vipPolicy_n=function(){
    ...
}
var getActualTotal=function(onSaleType,originTotal,account){
    switch(onSaleType){
        case 0:
            return vipPolicy_0(originTotal);
        case 1:
            return vipPolicy_0(originTotal);
        ...
        case n:
            return ...
        default:
            return originTotal;
    }
}
    好了,現在我們每種策略都有自己獨立的空間了,看起來井井有條。但還有兩個問題沒有解決:
  1. 隨著促銷策略的增加,

    getActualTotal
  2. 的程式碼量依然會越來越大
  3. #系統缺乏彈性,如果需要增加一種策略,那麼除了加入一個策略函數,還需要修改

    switch...case..
  4. 語句

###讓我們再來回顧一下策略模式的定義:###
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换

在我们的例子中,每种促销策略的实现方式是不一样的,但我们最终的目的都是为了求得实际金额。策略模式可以把我们对促销策略的算法一个个封装起来,并且使它们可互相替换而不影响我们对实际金额的求值,这正好是我们所需要的。

下面我们用策略模式来重构上面的代码:

<pre class="brush:php;toolbar:false">var policies={     &quot;Type_0&quot;:function(originTotal){         return originTotal-Math.floor(originTotal/100)*10      },     &quot;Type_1&quot;:function(originTotal){         return originTotal-Math.floor(originTotal/200)*30      },     ...     &quot;Type_n&quot;:function(originTotal){         ...      } } var getActualTotal=function(onSaleType,originTotal,account){     return policies[&quot;Type_&quot;+onSaleType](originTotal,account) } //执行 getActualTotal(0,2680.00);//2208</pre>

分析上面的代码我们发现,不管促销策略如何增加,getActualTotal函数完全不需要再变化了。我们要做的,就是增加新策略的函数而已。

通过策略模式的代码,我们消除了让人反胃的大片条件分支语句,getActualTotal本身并没有计算能力,而是将计算全权委托给了策略函数。

由此我们可以总结出策略模式实现的要点:

  1. 将变化的算法封装成独立的策略函数,并负责具体的计算

  2. 委托函数,该函数接受客户请求,并将请求委托给某一个具体的策略函数

用一张UML图表示如下:
設計模式的策略模式如何在前端使用

怎么样?现在看到上面这张图是不是有了了然于胸的感觉?那就赶紧去试一试策略模式吧!

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎样使用JS+H5实现微信摇一摇

如何对微信小程序进行开发

以上是設計模式的策略模式如何在前端使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版