這次帶給大家設計模式的策略模式怎樣在前端使用,設計模式的策略模式在前端使用注意事項有哪些,下面就是實戰案例,一起來看看。
什麼是策略模式?在
GoF四兄弟的經典《設計模式》中,對策略模式的定義如下:
定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換。
上邊這句話,從字面來看很簡單。但是如何在開發過程中應用,僅憑一個定義依然是一頭霧水。以筆者曾經做過的商家進銷存系統為例:
某家超市準備舉辦促銷活動,市場人員經過調查分析制定了一些促銷策略:
購物滿100減10
購物滿200減30
購物滿300減50
- # #。 。 。
收銀軟體的介面是這樣的(簡單示意):
我們該如何計算實際消費金額?
最初的實作是這樣的:<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
函數會越變越大,而且充滿了
判斷,稍一疏忽就容易弄錯。
我只能說,需求永遠不是程式設計師定的。 。這時,市場人員說我們新版程式加入了會員功能,我們需要支援以下的促銷策略:
- 會員促銷策略:
- 會員充300回60,且首單打9折
- 會員充500返100,且首單打8折
- 會員充1000回300,且首單打7折疊
- ...
這個時候,如果你還在原先的
getActualTotal
函數中繼續加上
判斷,我想如果你的領導者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; } }
- 好了,現在我們每種策略都有自己獨立的空間了,看起來井井有條。但還有兩個問題沒有解決:
-
getActualTotal隨著促銷策略的增加,
的程式碼量依然會越來越大 -
switch...case..#系統缺乏彈性,如果需要增加一種策略,那麼除了加入一個策略函數,還需要修改
語句
讓我們再來回顧一下策略模式的定義:
定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換
在我們的例子中,每種促銷策略的實現方式是不一樣的,但我們最終的目的都是為了求實際金額。策略模式可以把我們對促銷策略的演算法一個個封裝起來,並且使它們可互相替換而不影響我們對實際金額的求值,這正好是我們所需要的。
下面我們用策略模式來重構上面的程式碼:<pre class="brush:php;toolbar:false">var policies={
"Type_0":function(originTotal){
return originTotal-Math.floor(originTotal/100)*10
},
"Type_1":function(originTotal){
return originTotal-Math.floor(originTotal/200)*30
},
...
"Type_n":function(originTotal){
...
}
}
var getActualTotal=function(onSaleType,originTotal,account){
return policies["Type_"+onSaleType](originTotal,account)
}
//执行
getActualTotal(0,2680.00);//2208</pre>
分析上面的程式碼我們發現,不管促銷策略如何增加,
函數完全不需要再變化了。我們要做的,就是增加新策略的函數而已。 透過策略模式的程式碼,我們消除了讓人反胃的大片條件分支語句,
本身並沒有計算能力,而是將計算全權委託給了策略函數。
- 由此我們可以總結出策略模式實現的要點:
- ###將變化的演算法封裝成獨立的策略函數,並負責具體的計算####
委託函數,函數接受客戶請求,並將請求委託給某一個具體的策略函數
以UML圖表示如下:
怎麼樣?現在看到上面這張圖是不是有了然於胸部的感覺?那就趕快去試試策略模式吧!
參考書籍:
《設計模式:可重複使用物件導向軟體的基礎》
《大話設計模式》
#《Javascript設計模式與開發實踐》
做前端開發已經好幾年了,對設計模式一直沒有深入學習總結過。隨著架構相關的工作越來越多,越來越能感覺到設計模式成為了我前進道路上的阻礙。所以從今天開始深入學習和總結經典的設計模式以及物件導向的幾大原則。
今天第一天,首先來講策略模式。
什麼是策略模式?在
GoF四兄弟的經典《設計模式》中,對策略模式的定義如下:
定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換。
上邊這句話,從字面來看很簡單。但是如何在開發過程中應用,僅憑一個定義依然是一頭霧水。以筆者曾經做過的商家進銷存系統為例:
某家超市準備舉辦促銷活動,市場人員經過調查分析制定了一些促銷策略:
購物滿100減10
購物滿200減30
購物滿300減50
- # #。 。 。
收銀軟體的介面是這樣的(簡單示意):
我們該如何計算實際消費金額?
最初的實作是這樣的:<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
函數會越變越大,而且充滿了
判斷,稍一疏忽就容易弄錯。
我只能說,需求永遠不是程式設計師定的。 。這時,市場人員說我們新版程式加入了會員功能,我們需要支援以下的促銷策略:
- 會員促銷策略:
- 會員充300回60,且首單打9折
- 會員充500返100,且首單打8折
- 會員充1000回300,且首單打7折疊
- ...
這個時候,如果你還在原先的
getActualTotal
函數中繼續加上
判斷,我想如果你的領導者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; } }
- 好了,現在我們每種策略都有自己獨立的空間了,看起來井井有條。但還有兩個問題沒有解決:
-
getActualTotal隨著促銷策略的增加,
的程式碼量依然會越來越大 -
switch...case..#系統缺乏彈性,如果需要增加一種策略,那麼除了加入一個策略函數,還需要修改
語句
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换
在我们的例子中,每种促销策略的实现方式是不一样的,但我们最终的目的都是为了求得实际金额。策略模式可以把我们对促销策略的算法一个个封装起来,并且使它们可互相替换而不影响我们对实际金额的求值,这正好是我们所需要的。
下面我们用策略模式来重构上面的代码:
<pre class="brush:php;toolbar:false">var policies={ "Type_0":function(originTotal){ return originTotal-Math.floor(originTotal/100)*10 }, "Type_1":function(originTotal){ return originTotal-Math.floor(originTotal/200)*30 }, ... "Type_n":function(originTotal){ ... } } var getActualTotal=function(onSaleType,originTotal,account){ return policies["Type_"+onSaleType](originTotal,account) } //执行 getActualTotal(0,2680.00);//2208</pre>分析上面的代码我们发现,不管促销策略如何增加,getActualTotal
函数完全不需要再变化了。我们要做的,就是增加新策略的函数而已。
通过策略模式的代码,我们消除了让人反胃的大片条件分支语句,getActualTotal
本身并没有计算能力,而是将计算全权委托给了策略函数。
由此我们可以总结出策略模式实现的要点:
将变化的算法封装成独立的策略函数,并负责具体的计算
委托函数,该函数接受客户请求,并将请求委托给某一个具体的策略函数
用一张UML图表示如下:
怎么样?现在看到上面这张图是不是有了了然于胸的感觉?那就赶紧去试一试策略模式吧!
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是設計模式的策略模式如何在前端使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

如何在PHP后端功能开发中合理应用设计模式?设计模式是一种经过实践证明的解决特定问题的方案模板,可以用于构建可复用的代码,在开发过程中提高可维护性和可扩展性。在PHP后端功能开发中,合理应用设计模式可以帮助我们更好地组织和管理代码,提高代码质量和开发效率。本文将介绍常用的设计模式,并给出相应的PHP代码示例。单例模式(Singleton)单例模式适用于需要保

如何通过编写代码来学习和运用PHP8的设计模式设计模式是软件开发中常用的解决问题的方法论,它可以提高代码的可扩展性、可维护性和重用性。而PHP8作为最新版的PHP语言,也引入了许多新特性和改进,提供更多的工具和功能来支持设计模式的实现。本文将介绍一些常见的设计模式,并通过编写代码来演示在PHP8中如何运用这些设计模式。让我们开始吧!一、单例模式(Sing

本篇文章给大家带来了关于golang设计模式的相关知识,其中主要介绍了职责链模式是什么及其作用价值,还有职责链Go代码的具体实现方法,下面一起来看一下,希望对需要的朋友有所帮助。

随着数据的增长和复杂性的不断提升,ETL(Extract、Transform、Load)已成为数据处理中的重要环节。而Go语言作为一门高效、轻量的编程语言,越来越受到人们的热捧。本文将介绍Go语言中常用的ETL设计模式,以帮助读者更好地进行数据处理。一、Extractor设计模式Extractor是指从源数据中提取数据的组件,常见的有文件读取、数据库读取、A

单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。在 Go 语言中,实现单例模式有多种方式,本篇文章将带你深入掌握 Go 语言中的单例模式实现。

随着JavaScript的不断发展和应用范围的扩大,越来越多的开发人员开始意识到设计模式和最佳实践的重要性。设计模式是一种被证明在某些情况下有用的软件设计解决方案。而最佳实践则是指在编程过程中,我们可以应用的一些最佳的规范和方法。在本文中,我们将探讨JavaScript中的设计模式和最佳实践,并提供一些具体的代码示例。让我们开始吧!一、JavaScript中

设计模式的六大原则:1、单一职责原则,其核心就是控制类的粒度大小、将对象解耦、提高其内聚性;2、开闭原则,可以通过“抽象约束、封装变化”来实现;3、里氏替换原则,主要阐述了有关继承的一些原则;4、依赖倒置原则,降低了客户与实现模块之间的耦合;5、接口隔离原则,是为了约束接口、降低类对接口的依赖性;6、迪米特法则,要求限制软件实体之间通信的宽度和深度。

探索Java开发中的设计模式经验与建议设计模式是软件开发中用于解决特定问题的一种面向对象的可复用解决方案。在Java开发中,设计模式是很重要的一部分,它能够提高代码的可读性和可维护性,并且能够加速开发过程。通过运用设计模式,开发人员可以更好地组织和管理代码,同时也能够避免一些常见的开发错误。在Java开发中,有很多常用的设计模式,如单例模式、工厂模式、观察者


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版