JS設(shè)計(jì)模式之策略模式概念與用法分析
本文實(shí)例講述了JS設(shè)計(jì)模式之策略模式概念與用法。分享給大家供大家參考,具體如下:
策略模式的概念引用:
在軟件開(kāi)發(fā)中也常常遇到類(lèi)似的情況,實(shí)現(xiàn)某一個(gè)功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來(lái)完成該功能。
如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個(gè)類(lèi)中,如需要提供多種查找算法,可以將這些算法寫(xiě)到一個(gè)類(lèi)中,在該類(lèi)中提供多個(gè)方法,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的查找算法;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過(guò)if…else…或者case等條件判斷語(yǔ)句來(lái)進(jìn)行選擇。
這兩種實(shí)現(xiàn)方法我們都可以稱(chēng)之為硬編碼,如果需要增加一種新的查找算法,需要修改封裝算法類(lèi)的源代碼;更換查找算法,也需要修改客戶端調(diào)用代碼。
在這個(gè)算法類(lèi)中封裝了大量查找算法,該類(lèi)代碼將較復(fù)雜,維護(hù)較為困難。如果我們將這些策略包含在客戶端,這種做法更不可取,將導(dǎo)致客戶端程序龐大而且難以維護(hù),如果存在大量可供選擇的算法時(shí)問(wèn)題將變得更加嚴(yán)重.
舉例說(shuō)明:
一、出行旅游:我們可以有幾個(gè)策略可以考慮:可以騎自行車(chē),汽車(chē),做火車(chē),飛機(jī)。每個(gè)策略都可以得到相同的結(jié)果,但是它們使用了不同的資源。
選擇策略的依據(jù)是費(fèi)用,時(shí)間,使用工具還有每種方式的方便程度 。
二、在一個(gè)購(gòu)物商城,在五一做了一個(gè)活動(dòng),所以圖書(shū)類(lèi)商品根據(jù)購(gòu)買(mǎi)的金額做出以下折扣策略
1、購(gòu)買(mǎi)滿199元,打9折
2、購(gòu)買(mǎi)滿399元,打8折
3、購(gòu)買(mǎi)滿599元以上,打7折;
function BookStrategy() { this.calcPrice = function( price ) { console.log("未打折 = " + price); } } function BookCalc9Strategy() { this.calcPrice = function( price ) { console.log("原價(jià)是:"+ price +";打9折后:" + (price * 0.9)); } } function BookCalc8Strategy() { this.calcPrice = function( price ) { console.log("原價(jià)是:"+ price +";打8折后:" + (price * 0.8)); } } function BookCalc7Strategy() { this.calcPrice = function( price ) { console.log("原價(jià)是:"+ price +";打7折后:" + (price * 0.7)); } } function PriceCalc( _strategy ) { this.strategy = _strategy; this.getPrice = function( price ) { return this.strategy.calcPrice( price ); } } function Client() { var price = 100; var priceCalc = null; if ( 199 <= price && price < 399 ) { priceCalc = new PriceCalc(new BookCalc9Strategy()); } else if ( 399 <= price && price < 599 ) { priceCalc = new PriceCalc(new BookCalc8Strategy()); } else if ( 599 <= price ) { priceCalc = new PriceCalc(new BookCalc7Strategy()); } else { priceCalc = new PriceCalc(new BookStrategy()); } priceCalc.getPrice(price); } Client();
運(yùn)行結(jié)果:
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript實(shí)現(xiàn)封裝一個(gè)快速生成目錄樹(shù)的全局腳本
目錄樹(shù)可以很好的介紹項(xiàng)目中各文件目錄的用途,幫助讀者了解整個(gè)項(xiàng)目結(jié)構(gòu)。本文就來(lái)用JavaScript封裝一個(gè)快速生成目錄樹(shù)的全局腳本,希望對(duì)大家有所幫助2023-03-03JavaScript中的for...of和for...in循環(huán)容易遇到的問(wèn)題及解決方法總結(jié)
在 JavaScript 編程中,for...of 和 for...in 是常用的循環(huán)語(yǔ)法,但它們?cè)谑褂脮r(shí)可能會(huì)引發(fā)一些意想不到的問(wèn)題,本文將分享我在使用這兩種循環(huán)時(shí)所遇到的坑和經(jīng)驗(yàn),需要的朋友可以參考下2023-08-08基于JS+HTML實(shí)現(xiàn)彈窗提示是否確認(rèn)提交功能
這篇文章主要介紹了基于JS+HTML實(shí)現(xiàn)彈窗提示是否確認(rèn)提交功能,需要的朋友可以參考下2020-06-06個(gè)人網(wǎng)站留言頁(yè)面(前端jQuery編寫(xiě)、后臺(tái)php讀寫(xiě)MySQL)
這篇文章主要為大家介紹了個(gè)人網(wǎng)站的留言頁(yè)面,前端使用jQuery編寫(xiě)、后臺(tái)利用php簡(jiǎn)單讀寫(xiě)MySQL數(shù)據(jù)庫(kù),感興趣的小伙伴們可以參考一下2016-05-05解決Layui 表單提交數(shù)據(jù)為空的問(wèn)題
今天小編就為大家分享一篇解決Layui 表單提交數(shù)據(jù)為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08JavaScript實(shí)現(xiàn)語(yǔ)音排隊(duì)叫號(hào)系統(tǒng)
語(yǔ)音排隊(duì)叫號(hào)系統(tǒng)廣泛用于銀行,餐飲,醫(yī)院等場(chǎng)景。本文主要介紹了通過(guò)JavaScript實(shí)現(xiàn)的語(yǔ)音排隊(duì)叫號(hào)系統(tǒng),有掃碼排隊(duì),語(yǔ)音叫號(hào)等功能。需要的可以參考一下2021-12-12僅IE6/7/8中innerHTML返回值忽略英文空格的問(wèn)題
僅IE6/7/8中innerHTML返回值忽略英文空格的問(wèn)題,需要此問(wèn)題的朋友可以參考下。2011-04-04全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升
下面小編就為大家?guī)?lái)一篇全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08