成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計模式之策略模式

番茄西紅柿 / 700人閱讀

摘要:一定義定義維基百科策略模式作爲一種軟件設(shè)計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。

以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。

一、定義

定義(維基百科):策略模式作爲一種軟件設(shè)計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現(xiàn)算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。

策略模式,從模式名稱中我們就可以窺探一二。無非就是一個動作可以有不同的策略,有不同的計算方法,我們將計算方法進行封裝。如上的例子,美國稅務(wù)計算、中國的稅務(wù)計算采用了不同的計算方式(不同策略)。還有一個《大話設(shè)計模式》中的例子也很好的說明該設(shè)置模式,商場折扣,上次可能是滿減,這次可能是直接打折,這就是兩種不同的策略,那么我們在代碼里該怎樣設(shè)計,才會更清晰抽象這個問題呢?接下來我們就來看看策略模式是怎么抽象該類型的問題的。

二、策略模式UML圖

我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。圖片來源于維基百科??梢钥吹?,策略模式定義了一個策略的接口Stragegy,該接口定義了一個方法,即為該策略的操作方法。再實現(xiàn)不同的策略類ConcreteStrategyA、ConcreteStrategyB,繼承自策略接口。接著在上下文類Context類持有策略的引用,調(diào)用策略。


三、以商場打折為例子,我們來實現(xiàn)先策略模式。

1、先定義策略接口

package com.design.strategy;

/** * 商場打折接口 */
public interface IShopDiscountStrategy {    
    public int discount(int count);
}

2、再定義具體的策略

package com.design.strategy;
/** * 滿減計算策略 */
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);    
    }
}

到此,策略模式編寫的打折場景已經(jīng)編寫完畢,在來看看怎么調(diào)用

package com.design.strategy;public class StrategyTestMain {
    public static void main(String[] args) {        
        //使用滿減策略計算實收總額        
        DiscountContext discountContext = new DiscountContext(new DiscountFull(200, 100));
        System.out.println(discountContext.discount(200));        
        //使用折扣策略計算實收總額        
        DiscountContext discountContext1 = new DiscountContext(new DiscountPercent(0.7f)); 
        System.out.println(discountContext1.discount(200));    
    }
}

四、優(yōu)缺點

優(yōu)點

1、簡化單元測試

從例子我們就可以看出來每個策略都有多帶帶的類來實現(xiàn),我們可以當度對策略進行測試。

2、擴展性好

我們要定義新的策略,只需要編寫一個新的策略,并對新策略進行測試即可,不修改原來已經(jīng)存在策略的代碼。

3、避免使用多重條件轉(zhuǎn)移語句

策略模式中使用的策略是有客戶端選擇的,策略相關(guān)的類不需要通過多重條件去選擇策略。

缺點

1、客戶端需自行決定使用的策略

客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。

2、定義的類比較多

每個策略都得定義一個類來實現(xiàn)。

結(jié)語

策略模式暫時總結(jié)到這里。看起來策略模式還是比較簡單的,就是將不同的策略進行封裝。實際適用于一個操作有不同的策略的應(yīng)用場景中。如JDK中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。可以在創(chuàng)建線程池時,傳入相應(yīng)的處理策略。如下,最后一個參數(shù)傳入一個處理策略。策略接口為RejectedExecutionHandler,具體的實現(xiàn)有:DiscardOldestPolicy,AbortPolicy....

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,
        long keepAliveTime,TimeUnit unit,
        BlockingQueue workQueue,
        RejectedExecutionHandler handler)


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7151.html

相關(guān)文章

  • PHP面試???em>之設(shè)計模式——策略模式

    摘要:策略模式介紹策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。使用策略模式的好處策略模式提供了管理相關(guān)的算法族的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O(shè)計模式——工...

    Drinkey 評論0 收藏0
  • JavaScript設(shè)計模式策略模式

    摘要:設(shè)計模式與開發(fā)實踐讀書筆記。策略模式可以有效避免多重條件選擇語句。當然,策略模式也有一些缺點增加了許多策略類或者策略對象。要使用策略模式,必須了解所有的,違反了最少知識原則。至此,回家咯附設(shè)計模式之發(fā)布訂閱模式觀察者模式 《JavaScript設(shè)計模式與開發(fā)實踐》讀書筆記。這本書挺好的,推薦。 俗話說,條條大路通羅馬。在現(xiàn)實生活中,我們可以采用很多方法實現(xiàn)同一個目標。比如我們先定個小目...

    go4it 評論0 收藏0
  • 設(shè)計模式策略模式

    摘要:一定義定義維基百科策略模式作爲一種軟件設(shè)計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評論0 收藏0
  • 設(shè)計模式策略模式

    摘要:一定義定義維基百科策略模式作爲一種軟件設(shè)計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    MangoGoing 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<