策略模式

假設(shè)現(xiàn)在要設(shè)計(jì)一個(gè)販賣(mài)各類(lèi)書(shū)籍的電子商務(wù)網(wǎng)站的購(gòu)物車(chē)系統(tǒng)。一個(gè)最簡(jiǎn)單的情況就是把所有貨品的單價(jià)乘上數(shù)量,但是實(shí)際情況肯定比這要復(fù)雜。比如,本網(wǎng)站可能對(duì)所有的高級(jí)會(huì)員提供每本20%的促銷(xiāo)折扣;對(duì)中級(jí)會(huì)員提供每本10%的促銷(xiāo)折扣;對(duì)初級(jí)會(huì)員沒(méi)有折扣。

根據(jù)描述,折扣是根據(jù)以下的幾個(gè)算法中的一個(gè)進(jìn)行的:
  算法一:對(duì)初級(jí)會(huì)員沒(méi)有折扣。
  算法二:對(duì)中級(jí)會(huì)員提供10%的促銷(xiāo)折扣。
  算法三:對(duì)高級(jí)會(huì)員提供20%的促銷(xiāo)折扣。

public interface DiscountStrategy {
    /**
    * 折扣策略
    * @param booksPrice 圖書(shū)的原價(jià)
    * @return 計(jì)算出打折后的價(jià)格
    */
    public double calcPrice(double booksPrice);
}

初級(jí)會(huì)員

public class PrimaryMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice;
    }
}

中級(jí)會(huì)員

public class IntermediateMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice * 0.9;
    }
}

高級(jí)會(huì)員

public class AdvancedMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice * 0.8;
    }
}

價(jià)格類(lèi)

public class Price {
    //持有一個(gè)具體的策略對(duì)象
    private MemberStrategy strategy;
    /**
    * 構(gòu)造函數(shù),傳入一個(gè)具體的策略對(duì)象
    * @param strategy 具體的策略對(duì)象
    */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }
    public void setPrice(MemberStrategy strategy){
        this.strategy = strategy;
    }
    /**
    * 計(jì)算圖書(shū)的價(jià)格
    * @param booksPrice 圖書(shū)的原價(jià)
    * @return 計(jì)算出打折后的價(jià)格
    */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}

調(diào)用:

public class Client {
    public static void main(String[] args) {
        //選擇并創(chuàng)建需要使用的策略對(duì)象
        MemberStrategy strategy = new IntermediateMemberStrategy();
        Price price = new Price(strategy);
        //計(jì)算價(jià)格
        double quote = price.quote(300);
        System.out.println("圖書(shū)的最終價(jià)格為:" + quote);
    }
}

策略模式的重心不是如何實(shí)現(xiàn)算法,而是如何組織、調(diào)用這些算法,從而讓程序結(jié)構(gòu)更靈活,具有更好的維護(hù)性和擴(kuò)展性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 策略(Strategy)模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略...
    LeeLeCoder閱讀 621評(píng)論 0 1
  • 從本篇文章開(kāi)始將開(kāi)始一些列對(duì)Java設(shè)計(jì)模式的學(xué)習(xí)。Java設(shè)計(jì)模式是前任總結(jié)的優(yōu)秀的經(jīng)驗(yàn),是編寫(xiě)高質(zhì)量代碼的學(xué)習(xí)...
    Ruheng閱讀 2,051評(píng)論 2 9
  • 定義 策略模式屬于對(duì)象的行為模式。其用意是針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類(lèi)中,從而使得它們可...
    步積閱讀 820評(píng)論 0 2
  • 時(shí)光靜好,歲月易老. 紅顏相伴,此生無(wú)憾. 磨石溫書(shū),笑顏蘊(yùn)藏, 平淡生活,互敬互愛(ài)。 情之所牽,心之所系. 執(zhí)子...
    冰冰曼曼閱讀 493評(píng)論 0 0
  • 豐子愷層在一篇文章里寫(xiě)道:“頑童一腳踏死數(shù)百螞蟻,我勸他不要。并非愛(ài)惜螞蟻,或者想供養(yǎng)螞蟻,只恐這一點(diǎn)殘忍心擴(kuò)而充...
    小安子想當(dāng)ceo閱讀 534評(píng)論 0 0

友情鏈接更多精彩內(nèi)容