最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java行為型設(shè)計(jì)模式之策略模式詳解

 更新時(shí)間:2022年11月24日 16:33:47   作者:lpf_wei  
策略模式屬于Java-設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下

編程是一門藝術(shù),大批量的改動(dòng)顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。

在現(xiàn)實(shí)生活中常常遇到實(shí)現(xiàn)某種目標(biāo)存在多種策略可供選擇的情況,例如超市促銷可以釆用打折、送商品、送積分等方法。

在軟件開發(fā)中也常常遇到類似的情況,當(dāng)實(shí)現(xiàn)某一個(gè)功能存在多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能,如數(shù)據(jù)排序策略有快速排序、歸并排序、選擇排序、二叉樹排序等。

如果使用多重條件轉(zhuǎn)移語句實(shí)現(xiàn)(即硬編碼),不但使條件語句變得很復(fù)雜,而且增加、刪除或更換算法要修改原代碼,不易維護(hù),違背開閉原則。如果采用策略模式就能很好解決該問題。

1.策略設(shè)計(jì)模式定義

策略(Strategy)模式:該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。策略模式屬于對(duì)象行為模式,它通過對(duì)算法進(jìn)行封裝,把使用算法的責(zé)任和算法的實(shí)現(xiàn)分割開來,并委派給不同的對(duì)象對(duì)這些算法進(jìn)行管理。

2.策略設(shè)計(jì)模式的有點(diǎn)與不足

策略模式的主要優(yōu)點(diǎn):

  • 多重條件語句不易維護(hù),而使用策略模式可以避免使用多重條件語句,如 if…else 語句、switch…case 語句。
  • 策略模式提供了一系列的可供重用的算法族,恰當(dāng)使用繼承可以把算法族的公共代碼轉(zhuǎn)移到父類里面,從而避免重復(fù)的代碼。
  • 策略模式可以提供相同行為的不同實(shí)現(xiàn),客戶可以根據(jù)不同時(shí)間或空間要求選擇不同的。
  • 策略模式提供了對(duì)開閉原則的完美支持,可以在不修改原代碼的情況下,靈活增加新算法。
  • 策略模式把算法的使用放到環(huán)境類中,而算法的實(shí)現(xiàn)移到具體策略類中,實(shí)現(xiàn)了二者的分離。

策略設(shè)計(jì)模式的不足:

  • 客戶端必須理解所有策略算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴悺?/li>
  • 策略模式造成很多的策略類,增加維護(hù)難度。

3.策略設(shè)計(jì)模式的實(shí)現(xiàn)思路

策略模式是準(zhǔn)備一組算法,并將這組算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。策略模式的重心不是如何實(shí)現(xiàn)算法,而是如何組織這些算法,從而讓程序結(jié)構(gòu)更加靈活,具有更好的維護(hù)性和擴(kuò)展性。

策略設(shè)計(jì)模式涉及的角色:

  • 抽象策略(Strategy)類:定義了一個(gè)公共接口,各種不同的算法以不同的方式實(shí)現(xiàn)這個(gè)接口,環(huán)境角色使用這個(gè)接口調(diào)用不同的算法,一般使用接口或抽象類實(shí)現(xiàn)。
  • 具體策略(Concrete Strategy)類:實(shí)現(xiàn)了抽象策略定義的接口,提供具體的算法實(shí)現(xiàn)。
  • 環(huán)境(Context)類:持有一個(gè)策略類的引用,最終給客戶端調(diào)用。

4.代碼示例

/**
 * 折扣
 */
public interface Discount {
    /**
     * 計(jì)算價(jià)格
     * @param money
     * @return
     */
    public int calculate(int money);
}
/**
 * 滿減策略
 * 需要滿200
 */
public class FullDiscount implements Discount{
    @Override
    public int calculate(int money) {
        if (money>200){
            System.out.println("符合滿減策略,進(jìn)行滿減");
            return money - 30;
        }
        return money;
    }
}
/**
 * 假日折扣
 * 需要大于100
 */
public class HolidayDiscount implements Discount{
    @Override
    public int calculate(int money) {
        if (money > 100){
            return money - 10;
        }
        return money;
    }
}
/**
 * 新用戶減免
 * 但是也需要大于100
 */
public class NewerDiscount implements Discount{
    @Override
    public int calculate(int money) {
        if (money>100){
            return money-20;
        }
        return money;
    }
}
/**
 * 第二單8折優(yōu)惠
 */
public class SecondDiscount implements Discount {
    @Override
    public int calculate(int money) {
        Double balance =  money * 0.8;
        return balance.intValue();
    }
}
 public static void main(String[] args) {
        List<Fruit> products = new ArrayList();
        products.add(StaticFactory.getFruitApple());
        products.add(StaticFactory.getFruitBanana());
        products.add(StaticFactory.getFruitOrange());
        ShoppingCart cart = new CartShopping(products);
        /*注入優(yōu)惠方案*/
        cart.setDiscount(new FullDiscount());
        cart.submitOrder();
    }

5.策略設(shè)計(jì)模式的應(yīng)用場(chǎng)景

在程序設(shè)計(jì)中,通常在以下幾種情況中使用策略模式較多:

  • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種時(shí),可將每個(gè)算法封裝到策略類中。
  • 一個(gè)類定義了多種行為,并且這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn),可將每個(gè)條件分支移入它們各自的策略類中以代替這些條件語句。
  • 系統(tǒng)中各算法彼此完全獨(dú)立,且要求對(duì)客戶隱藏具體算法的實(shí)現(xiàn)細(xì)節(jié)時(shí)。
  • 系統(tǒng)要求使用算法的客戶不應(yīng)該知道其操作的數(shù)據(jù)時(shí),可使用策略模式來隱藏與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
  • 多個(gè)類只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。

到此這篇關(guān)于Java行為型設(shè)計(jì)模式之策略模式詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java讀取文件顯示進(jìn)度條的實(shí)現(xiàn)方法

    java讀取文件顯示進(jìn)度條的實(shí)現(xiàn)方法

    當(dāng)讀取一個(gè)大文件時(shí),一時(shí)半會(huì)兒無法看到讀取結(jié)果,就需要顯示一個(gè)進(jìn)度條,是程序員明白已經(jīng)讀了多少文件,可以估算讀取還需要多少時(shí)間,下面的代碼可以實(shí)現(xiàn)這個(gè)功能
    2014-01-01
  • 詳解Spring的@Value作用與使用場(chǎng)景

    詳解Spring的@Value作用與使用場(chǎng)景

    這篇文章主要介紹了詳解Spring的@Value作用與使用場(chǎng)景,Spring為大家提供許多開箱即用的功能,@Value就是一個(gè)極其常用的功能,它能將配置信息注入到bean中去,需要的朋友可以參考下
    2023-05-05
  • Spring?Boot整合Log4j2.xml的問題及解決方法

    Spring?Boot整合Log4j2.xml的問題及解決方法

    這篇文章主要介紹了Spring?Boot整合Log4j2.xml的問題,本文給大家分享解決方案,需要的朋友可以參考下
    2023-09-09
  • Java中的clone()和Cloneable接口實(shí)例

    Java中的clone()和Cloneable接口實(shí)例

    這篇文章主要介紹了Java中的clone()和Cloneable接口實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java連接orcale數(shù)據(jù)庫(kù)示例分享

    java連接orcale數(shù)據(jù)庫(kù)示例分享

    這篇文章主要介紹了java連接orcale數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下
    2014-02-02
  • mybatis update更新字段的使用操作

    mybatis update更新字段的使用操作

    這篇文章主要介紹了mybatis update更新字段的使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 深度理解Java訪問修飾符

    深度理解Java訪問修飾符

    今天帶大家學(xué)習(xí)的是Java的相關(guān)知識(shí),文章圍繞著Java訪問修飾符展開,有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • springboot + swagger 實(shí)例代碼

    springboot + swagger 實(shí)例代碼

    本篇文章主要介紹了springboot + swagger 實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Mybatis調(diào)用存儲(chǔ)過程的案例

    Mybatis調(diào)用存儲(chǔ)過程的案例

    這篇文章主要介紹了Mybatis如何調(diào)用存儲(chǔ)過程,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • java獲取手機(jī)已安裝APK的簽名摘要

    java獲取手機(jī)已安裝APK的簽名摘要

    這篇文章主要介紹了java獲取手機(jī)已安裝APK的簽名摘要的相關(guān)資料,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

永州市| 广东省| 蓝田县| 利川市| 洛南县| 荣昌县| 独山县| 台江县| 麻栗坡县| 淮北市| 家居| 凤庆县| 罗田县| 浪卡子县| 宁明县| 马鞍山市| 永新县| 体育| 新宁县| 射阳县| 根河市| 旬阳县| 英吉沙县| 永川市| 固始县| 清丰县| 中卫市| 井冈山市| 大理市| 海淀区| 宁波市| 西峡县| 攀枝花市| 邯郸市| 永年县| 甘谷县| 许昌市| 鄂托克旗| 镇平县| 临沭县| 马山县|