定義一系列算法,將每個(gè)算法封裝成獨(dú)立的對(duì)象,并使這些對(duì)象可互相替換。這使得在運(yùn)行時(shí)可以動(dòng)態(tài)地選擇算法,而不必改變使用算法的客戶(hù)端代碼。策略模式的主要目標(biāo)是將算法的定義與使用分離,使得客戶(hù)端可以根據(jù)需要靈活地選擇和切換不同的算法,而不影響到客戶(hù)端代碼的穩(wěn)定性。
策略模式的使用場(chǎng)景
- 多種算法實(shí)現(xiàn):
當(dāng)一個(gè)問(wèn)題有多種算法實(shí)現(xiàn)時(shí),可以使用策略模式來(lái)將這些算法封裝成獨(dú)立的策略類(lèi),使得這些算法可以互相替換,而不影響客戶(hù)端代碼。 - 避免條件判斷:
當(dāng)存在大量的條件語(yǔ)句來(lái)選擇不同的行為時(shí),可以使用策略模式將這些行為封裝成策略類(lèi),從而減少條件判斷,提高代碼的可讀性和可維護(hù)性。 - 算法變化頻繁:
如果系統(tǒng)中的算法經(jīng)常需要變化,使用策略模式可以方便地新增、修改和替換算法,而不必修改客戶(hù)端代碼。 - 開(kāi)閉原則支持:
策略模式支持開(kāi)閉原則,可以在不修改已有代碼的情況下擴(kuò)展系統(tǒng)功能。 - 分層架構(gòu):
在分層架構(gòu)中,策略模式可以用于將業(yè)務(wù)邏輯與具體的實(shí)現(xiàn)分離,使得業(yè)務(wù)邏輯層和具體實(shí)現(xiàn)層解耦。 - 配置靈活性:
當(dāng)需要根據(jù)配置文件或用戶(hù)輸入來(lái)選擇不同的行為時(shí),策略模式可以提供靈活的配置方式。 - 測(cè)試和維護(hù)性:
由于策略模式將不同的算法分離成獨(dú)立的策略類(lèi),可以更方便地進(jìn)行單元測(cè)試和維護(hù)。
策略模式主要角色
- 策略接口
定義了一組算法的共同接口,具體策略類(lèi)需要實(shí)現(xiàn)這個(gè)接口。它通常包含一個(gè)或多個(gè)抽象方法,用于定義不同算法的行為。 - 具體策略類(lèi)
實(shí)現(xiàn)了策略接口,即具體的算法邏輯。每個(gè)具體策略類(lèi)負(fù)責(zé)實(shí)現(xiàn)一個(gè)特定的算法。具體策略類(lèi)之間是可以相互替換的,客戶(hù)端代碼不需要知道具體算法的實(shí)現(xiàn)細(xì)節(jié)。 - 上下文
持有一個(gè)策略對(duì)象,并在需要時(shí)調(diào)用策略的方法。上下文將算法的執(zhí)行委托給具體的策略對(duì)象。上下文也可以包含一些輔助方法,用于操作策略對(duì)象。
策略模式的流程
- 客戶(hù)端創(chuàng)建一個(gè)上下文對(duì)象,并設(shè)置具體的策略對(duì)象。
- 當(dāng)客戶(hù)端需要執(zhí)行特定算法時(shí),它調(diào)用上下文的方法,上下文會(huì)將請(qǐng)求委托給具體策略對(duì)象
- 具體策略對(duì)象執(zhí)行算法,并將結(jié)果返回給上下文,上下文將結(jié)果傳遞給客戶(hù)端。
策略模式j(luò)ava代碼示例
實(shí)現(xiàn)一生鮮市場(chǎng)到點(diǎn)打折活動(dòng)
策略接口
// 策略接口
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}
策略實(shí)現(xiàn)類(lèi)
public class RegularDiscount implements DiscountStrategy{
@Override
public double applyDiscount(double originalPrice) {
return originalPrice;//原價(jià)
}
}
public class SaleDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
return originalPrice*0.8;//8折
}
}
public class SpecialDiscount implements DiscountStrategy{
@Override
public double applyDiscount(double originalPrice) {
return originalPrice*0.5;//5折
}
}
上下文
// 上下文類(lèi)
public class ShoppingCart{
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
//獲取最新價(jià)格
public double getPrice(double regularPrice){
return discountStrategy.applyDiscount(regularPrice);
}
}
客戶(hù)端
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
double originalPrice = 100.0;
double discountedPrice;
cart.setDiscountStrategy(new RegularDiscount());
discountedPrice = cart.getPrice(originalPrice);
System.out.println("8點(diǎn)價(jià)格:"+discountedPrice);
cart.setDiscountStrategy(new SaleDiscount());
discountedPrice = cart.getPrice(originalPrice);
System.out.println("9點(diǎn)價(jià)格:"+discountedPrice);
cart.setDiscountStrategy(new SpecialDiscount());
discountedPrice = cart.getPrice(originalPrice);
System.out.println("10點(diǎn)價(jià)格:"+discountedPrice);
}
輸出
8點(diǎn)價(jià)格:100.0
9點(diǎn)價(jià)格:80.0
10點(diǎn)價(jià)格:50.0
策略模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-667558.html
- 靈活性高: 策略模式使得算法可以獨(dú)立地變化,而不會(huì)影響到客戶(hù)端代碼??梢噪S時(shí)切換或擴(kuò)展算法,而無(wú)需修改客戶(hù)端。
- 可維護(hù)性好: 每個(gè)具體策略類(lèi)都具備清晰的職責(zé),使得代碼更加模塊化和可讀。新增或修改算法時(shí),只需修改相應(yīng)的策略類(lèi),不影響其他部分
- 遵循開(kāi)閉原則: 策略模式支持開(kāi)閉原則,可以在不修改已有代碼的情況下添加新的策略類(lèi)
- 消除條件判斷: 策略模式可以避免大量的條件判斷,將不同的行為封裝到不同的策略類(lèi)中,使得代碼更加簡(jiǎn)潔
- 可測(cè)試性強(qiáng): 每個(gè)策略類(lèi)都是相對(duì)獨(dú)立的,易于進(jìn)行單元測(cè)試。
缺點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-667558.html
- 類(lèi)數(shù)量增多: 策略模式會(huì)引入多個(gè)具體策略類(lèi),可能導(dǎo)致類(lèi)的數(shù)量增多,增加了代碼的復(fù)雜度。
- 客戶(hù)端需要了解策略: 客戶(hù)端需要了解不同的策略類(lèi),并選擇適當(dāng)?shù)牟呗?,這可能在某些情況下增加了客戶(hù)端的復(fù)雜度
- 增加對(duì)象數(shù)量: 每個(gè)策略類(lèi)都是一個(gè)對(duì)象,可能會(huì)增加系統(tǒng)的對(duì)象數(shù)量。在某些情況下,可以通過(guò)共享策略對(duì)象來(lái)緩解這個(gè)問(wèn)題
- 上下文類(lèi)復(fù)雜: 上下文類(lèi)需要持有一個(gè)策略對(duì)象,并在運(yùn)行時(shí)選擇合適的策略。在某些情況下,可能會(huì)使上下文類(lèi)變得復(fù)雜
到了這里,關(guān)于設(shè)計(jì)模式二十二:策略模式(Strategy Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!