国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java設(shè)計(jì)模式——策略模式

這篇具有很好參考價(jià)值的文章主要介紹了Java設(shè)計(jì)模式——策略模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 策略模式簡(jiǎn)介

策略模式: 策略模式是一種行為型模式, 它將對(duì)象和行為分開, 將行為定義為一個(gè)行為接口和具體行為的實(shí)現(xiàn) 策略模式最大的特點(diǎn)是行為的變化, 行為之間可以相互替換 每個(gè)if判斷都可以理解為一個(gè)策略. 本模式是的算法可獨(dú)立于使用它的用戶而變化

2. 模式結(jié)構(gòu)

策略模式包括如下角色:

  • Strategy: 抽象策略類: 策略是一個(gè)接口,? 該接口定義若干個(gè)算法標(biāo)識(shí), 即定義了若干個(gè)抽象方法(入下圖algorithm())
  • Context: 上下文類:

? ? ? ? 1. 上下文依賴于接口的類(是面向策略設(shè)計(jì)的類, 如下圖Context類), 即上下文包含用策略聲? ? ? ? ????????? 明的變量(如下圖的strategy成員變量)

? ? ? ? 2. 上下文提供一個(gè)方法(如下圖Context類中的lookAlrorithm()方法), 持有一個(gè)策略類的引用,? ? ? ? ? ? ? 最終給客戶端嗲用, 該方法委托策略變量調(diào)用具體策略所實(shí)現(xiàn)的策略接口中的方法(實(shí)現(xiàn)接口? ? ? ? ? ??的類重寫策略(接口)中的方法, 來完成具體的功能)

  • ConcreteStategy: 具體策略類: 具體策略是實(shí)現(xiàn)策略接口的類(如下圖中的ConcreteStrategyA類和ConcreteStrategyB類) 具體策略實(shí)現(xiàn)策略接口所定義的方法, 即給出算法標(biāo)識(shí)的具體方法(說白了就是重寫策略類的方法)

Java設(shè)計(jì)模式——策略模式

?3. 案例

Java設(shè)計(jì)模式——策略模式

?1)傳統(tǒng)模式實(shí)現(xiàn)

  public Double calculationPrice(String type, Double originalPrice, int n) {

        //中級(jí)會(huì)員計(jì)費(fèi)
        if (type.equals("intermediateMember")) {
            return originalPrice * n - originalPrice * 0.1;
        }
        //高級(jí)會(huì)員計(jì)費(fèi)
        if (type.equals("advancePrimaryMember")) {
            return originalPrice * n - originalPrice * 0.2;
        }
        //普通會(huì)員計(jì)費(fèi)
        return originalPrice;
    }

傳統(tǒng)的實(shí)現(xiàn)方式, 通過傳統(tǒng)if代碼判斷, 這樣就會(huì)導(dǎo)致后期維護(hù)性很差, 當(dāng)后期需要新增計(jì)費(fèi)方式, 還需要在這里再加上if(), 也不符合設(shè)計(jì)模式的開閉原則

2)策略模式的實(shí)現(xiàn)

抽象類策略

public interface MemberStrategy {
    // 一個(gè)計(jì)算價(jià)格的抽象方法
    //price商品的價(jià)格 n商品的個(gè)數(shù)
    public double calcPrice(double price, int n);
}

具體實(shí)現(xiàn)類

// 普通會(huì)員——不打折
public class PrimaryMemberStrategy implements MemberStrategy { // 實(shí)現(xiàn)策略
    //重寫策略方法具體實(shí)現(xiàn)功能
    @Override
    public double calcPrice(double price, int n) {
        return price * n;
    }
}
// 中級(jí)會(huì)員 打百分之10的折扣
public class IntermediateMemberStrategy implements MemberStrategy{
    @Override
    public double calcPrice(double price, int n) {
        double money = (price * n) - price * n * 0.1;
        return money;
    }
}

/ 高級(jí)會(huì)員類 20%折扣
public class AdvanceMemberStrategy implements MemberStrategy{
    @Override
    public double calcPrice(double price, int n) {
        double money = price * n - price * n * 0.2;
        return money;
    }
}

上下文類

也叫上下文或者環(huán)境類, 承上啟下的作用

/**
 * 負(fù)責(zé)和具體的策略類交互
 * 這樣的話,具體的算法和直接的客戶端調(diào)用分離了,使得算法可以獨(dú)立于客戶端獨(dú)立的變化。
 */

// 上下文類/環(huán)境類
public class MemberContext {
    // 用戶折扣策略接口
    private MemberStrategy memberStrategy;

    // 注入構(gòu)造方法
    public MemberContext(MemberStrategy memberStrategy) {
        this.memberStrategy = memberStrategy;
    }

    // 計(jì)算價(jià)格
    public double qoutePrice(double goodsPrice, int n){
        // 通過接口變量調(diào)用對(duì)應(yīng)的具體策略
        return memberStrategy.calcPrice(goodsPrice, n);
    }

}

測(cè)試類

// 測(cè)試類
public class Application {
    public static void main(String[] args) {

        // 具體行為策略
        MemberStrategy primaryMemberStrategy = new PrimaryMemberStrategy(); // 接口回調(diào)
        MemberStrategy intermediateMemberStrategy = new IntermediateMemberStrategy();
        MemberStrategy advanceMemberStrategy = new AdvanceMemberStrategy();

        // 用戶選擇不同策略
        MemberContext primaryContext = new MemberContext(primaryMemberStrategy);
        MemberContext intermediateContext = new MemberContext(intermediateMemberStrategy);
        MemberContext advanceContext = new MemberContext(advanceMemberStrategy);

        //計(jì)算一本300塊錢的書
        System.out.println("普通會(huì)員的價(jià)格:"+ primaryContext.qoutePrice(300,1));//300
        System.out.println("中級(jí)會(huì)員的價(jià)格:"+ intermediateContext.qoutePrice(300,1));//270
        System.out.println("高級(jí)會(huì)員的價(jià)格:"+ advanceContext.qoutePrice(300,1));//240
    }
}

上述案例UML類圖

Java設(shè)計(jì)模式——策略模式

?4. 策略模式優(yōu)缺點(diǎn)

1)優(yōu)點(diǎn)

  • 策略模式提供了不同的實(shí)現(xiàn)方法(算法)
  • 策略模式提供了可以替換繼承關(guān)系的辦法
  • 使用策略歐式可以避免使用多重條件轉(zhuǎn)移語句

2)缺點(diǎn)

  • 客戶端必須知道所有的策略類, 并自行決定使用哪一個(gè)策略類
  • 策略模式將造成很多策略類

5.策略模式的應(yīng)用場(chǎng)景

  • 如果一個(gè)系統(tǒng)里面有很多類, 它們之間的區(qū)別僅在于它們的行為, 那么使用策略模式可以動(dòng)態(tài)讓一個(gè)對(duì)象在許多行為中選擇一個(gè)行為
  • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法中選擇一種
  • 不希望客戶端知道復(fù)雜的, 與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu), 提高算法的保密性和安全性

在我們生活中常見的應(yīng)用模式有:

1、電商網(wǎng)站支付方式,一般分為銀聯(lián)、微信、支付寶,可以采用策略模式
2、電商網(wǎng)站活動(dòng)方式,一般分為滿減送、限時(shí)折扣、包郵活動(dòng),拼團(tuán)等可以采用策略模式

6. 總結(jié): 核心思想就是多態(tài)

  • 在策略模式中定義了一系列算法, 將每一個(gè)算法封裝起來, 策略模式讓算法獨(dú)立, 隨著使用它的客戶而變化
  • 策略模式包含3個(gè)角色: 上下文解決某個(gè)問題時(shí)可以采用多種策略, 在上下文中維護(hù)一個(gè)對(duì)抽象策略類的引用實(shí)例; 抽象策略類為所支持的算法聲明了抽象的方法, 是所有策略類的父類; 具體策略類實(shí)現(xiàn)了在抽象策略類中定義的算法
  • 策略模式的使用情況: 在一個(gè)系統(tǒng)中許多類, 它們之間區(qū)別僅在于它們的行為, 使用策略模式可以動(dòng)態(tài)的讓一個(gè)對(duì)象在許多行為中選擇一種行為

???????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-501156.html

到了這里,關(guān)于Java設(shè)計(jì)模式——策略模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java設(shè)計(jì)模式——策略

    前言 策略模式是平時(shí)Java開發(fā)中常用的一種,雖然已有很多講解設(shè)計(jì)模式的文章,但是這里還是寫篇文章來從自己理解的角度講解一下。 我們不妨進(jìn)行場(chǎng)景假設(shè),要對(duì)我們的軟件進(jìn)行授權(quán)管理:在啟動(dòng)我們的軟件之前先要校驗(yàn)是否存在合法的授權(quán),如果授權(quán)不合法則要求用戶

    2024年02月20日
    瀏覽(19)
  • Java設(shè)計(jì)模式之策略(Strategy)模式

    策略(Strategy)設(shè)計(jì)模式定義了一系列算法,將它們封裝起來,并且可以相互替換使用,從而使得算法可以獨(dú)立于使用它的客戶而變化。 策略(Strategy)設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法。策略模式將算法封裝為算法族,從而可以在運(yùn)行時(shí)根據(jù)

    2024年02月15日
    瀏覽(33)
  • Java設(shè)計(jì)模式—策略模式(Strategy Mode)

    目錄 前言 一、策略模式的簡(jiǎn)介 二、策略模式的概念 三、策略模式的作用 四、策略模式的優(yōu)、缺點(diǎn) 策略模式的優(yōu)點(diǎn): 策略模式的缺點(diǎn): 五、策略模式應(yīng)用場(chǎng)景 六、代碼案例 1)抽象接口類 2)具體的策略類:減 3)具體策略類:打折 4)上下文類 5)客戶端Main代碼測(cè)試 總結(jié)

    2024年02月08日
    瀏覽(33)
  • Java設(shè)計(jì)模式-策略模式-基于Spring實(shí)現(xiàn)

    Java設(shè)計(jì)模式-策略模式-基于Spring實(shí)現(xiàn)

    策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為。它將算法封裝在 獨(dú)立的策略類 中,使得它們可以相互替換,而不影響客戶端代碼。這種模式通過 將算法的選擇從客戶端代碼中分離出來 ,提供了更大的靈活性和可維護(hù)性。 在Java中,策略模式的設(shè)計(jì)理念可以

    2024年02月08日
    瀏覽(25)
  • Java設(shè)計(jì)模式:簡(jiǎn)介與常見模式

    Java中常見的設(shè)計(jì)模式有很多,以下是其中一些常見的設(shè)計(jì)模式及其作用、優(yōu)勢(shì)和適用場(chǎng)景: 作用:確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問點(diǎn)。 優(yōu)勢(shì):節(jié)約系統(tǒng)資源,避免多個(gè)實(shí)例造成的沖突。 適用場(chǎng)景:需要限制類的實(shí)例化次數(shù),例如線程池、數(shù)據(jù)庫連接池。 作用:

    2024年02月09日
    瀏覽(26)
  • Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    ????????在平時(shí)的開發(fā)中,涉及到設(shè)計(jì)模式的有兩塊內(nèi)容,第一個(gè)是我們 平時(shí)使用的框架 (比如spring、mybatis等),第二個(gè)是我們自己開發(fā)業(yè)務(wù)使用的設(shè)計(jì)模式。 ????????面試官一般比較關(guān)心的是你在開發(fā)過程中, 有沒有使用過設(shè)計(jì)模式,或者你在簡(jiǎn)歷上寫了關(guān)于設(shè)計(jì)

    2024年02月10日
    瀏覽(29)
  • 【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    有各種鴨子,比如野鴨、北京鴨、水鴨等。 鴨子有各種行為,比如走路、叫、飛行等。不同鴨子的行為可能略有不同。要求顯示鴨子的信息 不同的鴨子繼承一個(gè)父類Duck,如果是相同的行為就繼承,不同行為就重寫方法 實(shí)現(xiàn) 【鴨子抽象類】 【野鴨】 【北京鴨】 【玩具鴨】

    2024年02月12日
    瀏覽(34)
  • 【策略設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

    【策略設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

    策略模式(Strategy Pattern)屬于行為型設(shè)計(jì)模式。將每一個(gè)算法封裝到具有共同接口的獨(dú)立類中,根據(jù)需要來綁定策略,使得具體實(shí)現(xiàn)和策略解耦。 當(dāng)你想使用對(duì)象中各種不同的算法變體,使用if...else 所帶來的復(fù)雜和難以維護(hù),可使用策略模式?;蛘弋?dāng)有許多相同類,它們僅

    2024年02月01日
    瀏覽(21)
  • 設(shè)計(jì)模式篇章(4)——十一種行為型模式

    設(shè)計(jì)模式篇章(4)——十一種行為型模式

    這個(gè)設(shè)計(jì)模式主要思考的是如何分配對(duì)象的職責(zé)和將對(duì)象之間相互協(xié)作完成單個(gè)對(duì)象無法完成的任務(wù),這個(gè)與結(jié)構(gòu)型模式有點(diǎn)像,結(jié)構(gòu)型可以理解為靜態(tài)的組合,例如將不同的組件拼起來成為一個(gè)更大的組件;而行為型更是一種動(dòng)態(tài)或者具有某個(gè)動(dòng)作觸發(fā)的事件,具有一定行

    2024年01月21日
    瀏覽(18)
  • 設(shè)計(jì)模式的另一種有趣理解

    單例模式:?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例單例模式。單例模式只應(yīng)在有真正的“單一實(shí)例”的需求時(shí)才可使用。 俺有6個(gè)漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道“老公”,都是指的同一

    2024年02月22日
    瀏覽(100)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包