摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。
以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。
一、定義定義(維基百科):策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。比如每個(gè)人都要“交個(gè)人所得稅”,但是“在美國(guó)交個(gè)人所得稅”和“在中國(guó)交個(gè)人所得稅”就有不同的算稅方法。
策略模式,從模式名稱中我們就可以窺探一二。無(wú)非就是一個(gè)動(dòng)作可以有不同的策略,有不同的計(jì)算方法,我們將計(jì)算方法進(jìn)行封裝。如上的例子,美國(guó)稅務(wù)計(jì)算、中國(guó)的稅務(wù)計(jì)算采用了不同的計(jì)算方式(不同策略)。還有一個(gè)《大話設(shè)計(jì)模式》中的例子也很好的說(shuō)明該設(shè)置模式,商場(chǎng)折扣,上次可能是滿減,這次可能是直接打折,這就是兩種不同的策略,那么我們?cè)诖a里該怎樣設(shè)計(jì),才會(huì)更清晰抽象這個(gè)問(wèn)題呢?接下來(lái)我們就來(lái)看看策略模式是怎么抽象該類型的問(wèn)題的。
二、策略模式UML圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。圖片來(lái)源于維基百科??梢钥吹?,策略模式定義了一個(gè)策略的接口Stragegy,該接口定義了一個(gè)方法,即為該策略的操作方法。再實(shí)現(xiàn)不同的策略類ConcreteStrategyA、ConcreteStrategyB,繼承自策略接口。接著在上下文類Context類持有策略的引用,調(diào)用策略。
1、先定義策略接口
package com.design.strategy; /** * 商場(chǎng)打折接口 */ public interface IShopDiscountStrategy { public int discount(int count); }
2、再定義具體的策略
package com.design.strategy;
/** * 滿減計(jì)算策略 */
public class DiscountFull implements IShopDiscountStrategy
{
//滿的金額
private int fullCount;
//減的金額
private int disCash;
public DiscountFull(int fullCount,int disCash){
this.fullCount = fullCount;
this.disCash = disCash;
}
@Override
public int discount(int count) {
if (count >= fullCount){
return count -disCash;
}
return count;
}
}
package com.design.strategy;
/** * 打折策略,打7折 */
public class DiscountPercent implements IShopDiscountStrategy
{
//折扣率
private float disPer;
public DiscountPercent(float disPer){
this.disPer = disPer;
}
@Override
public int discount(int count) {
return (int) (count * disPer);
}
}
3、再定義上下文類,持有具體的策略引用。
package com.design.strategy;
public class DiscountContext {
private IShopDiscountStrategy iShopDiscountStrategy;
public DiscountContext(IShopDiscountStrategy iShopDiscountStrategy) {
this.iShopDiscountStrategy = iShopDiscountStrategy;
}
public int discount(int count){
return iShopDiscountStrategy.discount(count);
}
}
到此,策略模式編寫的打折場(chǎng)景已經(jīng)編寫完畢,在來(lái)看看怎么調(diào)用
package com.design.strategy;public class StrategyTestMain { public static void main(String[] args) { //使用滿減策略計(jì)算實(shí)收總額 DiscountContext discountContext = new DiscountContext(new DiscountFull(200, 100)); System.out.println(discountContext.discount(200)); //使用折扣策略計(jì)算實(shí)收總額 DiscountContext discountContext1 = new DiscountContext(new DiscountPercent(0.7f)); System.out.println(discountContext1.discount(200)); } }
四、優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1、簡(jiǎn)化單元測(cè)試
從例子我們就可以看出來(lái)每個(gè)策略都有多帶帶的類來(lái)實(shí)現(xiàn),我們可以當(dāng)度對(duì)策略進(jìn)行測(cè)試。
2、擴(kuò)展性好
我們要定義新的策略,只需要編寫一個(gè)新的策略,并對(duì)新策略進(jìn)行測(cè)試即可,不修改原來(lái)已經(jīng)存在策略的代碼。
3、避免使用多重條件轉(zhuǎn)移語(yǔ)句
策略模式中使用的策略是有客戶端選擇的,策略相關(guān)的類不需要通過(guò)多重條件去選擇策略。
缺點(diǎn)1、客戶端需自行決定使用的策略
客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。
2、定義的類比較多
每個(gè)策略都得定義一個(gè)類來(lái)實(shí)現(xiàn)。
結(jié)語(yǔ)策略模式暫時(shí)總結(jié)到這里。看起來(lái)策略模式還是比較簡(jiǎn)單的,就是將不同的策略進(jìn)行封裝。實(shí)際適用于一個(gè)操作有不同的策略的應(yīng)用場(chǎng)景中。如JDK中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式??梢栽趧?chuàng)建線程池時(shí),傳入相應(yīng)的處理策略。如下,最后一個(gè)參數(shù)傳入一個(gè)處理策略。策略接口為RejectedExecutionHandler,具體的實(shí)現(xiàn)有:DiscardOldestPolicy,AbortPolicy....
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueueworkQueue, RejectedExecutionHandler handler)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7103.html
摘要:策略模式介紹策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。使用策略模式的好處策略模式提供了管理相關(guān)的算法族的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。 你好,是我琉憶,PHP程序員面試筆試系列圖書(shū)的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設(shè)計(jì)模式——工...
摘要:設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)筆記。策略模式可以有效避免多重條件選擇語(yǔ)句。當(dāng)然,策略模式也有一些缺點(diǎn)增加了許多策略類或者策略對(duì)象。要使用策略模式,必須了解所有的,違反了最少知識(shí)原則。至此,回家咯附設(shè)計(jì)模式之發(fā)布訂閱模式觀察者模式 《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》讀書(shū)筆記。這本書(shū)挺好的,推薦。 俗話說(shuō),條條大路通羅馬。在現(xiàn)實(shí)生活中,我們可以采用很多方法實(shí)現(xiàn)同一個(gè)目標(biāo)。比如我們先定個(gè)小目...
摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
閱讀 735·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6182·2021-11-29 11:00