1. 模式定義
定義一系列的算法屎鳍,把每一個(gè)算法封裝起來(lái)楷怒,并且使它們可相互替換垛吗。策略設(shè)計(jì)模式使得算法可
獨(dú)立于使用它的客戶而獨(dú)立變化织堂。
2. 策略示例
假如我們要做一款理財(cái)產(chǎn)品,有支付寶和微信兩個(gè)支付渠道听怕,兩個(gè)渠道的金額算法不一樣捧挺,這時(shí)再來(lái)了一個(gè)工行支付渠道又或者后面再來(lái)多幾個(gè)渠道,而當(dāng)每個(gè)渠道的金額算法不一樣的時(shí)候尿瞭,這時(shí)使用策略設(shè)計(jì)模式將各個(gè)渠道的金額算法封裝起來(lái)闽烙,即可條理清晰,萬(wàn)一某個(gè)渠道的算法發(fā)生改變声搁,也可直接修改該渠道的算法黑竞。
假設(shè)我們有一原價(jià) 100 商品,各個(gè)渠道都有優(yōu)惠疏旨,但優(yōu)惠力道不同很魂,支付寶是優(yōu)惠是:原價(jià)-(原價(jià)/10),微信優(yōu)惠是:// 原價(jià)-(原價(jià)/20)檐涝,工行優(yōu)惠是:原價(jià) - 0.1遏匆,那用策略設(shè)計(jì)模式的寫(xiě)法如下。
定義價(jià)格策略接口 IPrice.java
public interface IPrice {
double price(double originPrice);
}
分別三種支付方式實(shí)現(xiàn)價(jià)格策略接口谁榜,具體的策略實(shí)現(xiàn)幅聘,將金額算法寫(xiě)在其中
public class AliPayPrice implements IPrice {
@Override
public double price(double originPrice) {
// 原價(jià)-(原價(jià)/10)
BigDecimal discountPrice = new BigDecimal(originPrice).divide(new BigDecimal(10), 2, BigDecimal.ROUND_HALF_UP);
return new BigDecimal(originPrice).subtract(discountPrice).doubleValue();
}
}
public class WechatPayPrice implements IPrice {
@Override
public double price(double originPrice) {
// 原價(jià)-(原價(jià)/20)
BigDecimal discountPrice = new BigDecimal(originPrice).divide(new BigDecimal(20), 2, BigDecimal.ROUND_HALF_UP);
return new BigDecimal(originPrice).subtract(discountPrice).doubleValue();
}
}
public class GonghangPayPrice implements IPrice {
@Override
public double price(double originPrice) {
// 原價(jià) - 0.1
return originPrice - 0.1d;
}
}
建立上下文角色,用來(lái)操作策略的上下文環(huán)境窃植,起到承上啟下的作用帝蒿,屏蔽高層模塊對(duì)策略、算
法的直接訪問(wèn)巷怜。
public class PriceContext {
private IPrice iPrice;
public PriceContext(IPrice iPrice) {
this.iPrice = iPrice;
}
public double price(double originPrice) {
return this.iPrice.price(originPrice);
}
}
3. 測(cè)試實(shí)現(xiàn)
在的開(kāi)發(fā)客戶端中葛超,我們可以這樣來(lái)使用
public class AppClient {
public static void main(String[] args){
double originPrice = 100d;
AliPayPrice aliPayPrice = new AliPayPrice();
PriceContext priceContext = new PriceContext(aliPayPrice);
System.out.println("price = "+ priceContext.price(originPrice)); // 結(jié)果:price = 90.00
WechatPayPrice wechatPayPrice = new WechatPayPrice();
priceContext = new PriceContext(wechatPayPrice);
System.out.println("price = "+ priceContext.price(originPrice)); // 結(jié)果:price = 95.00
GonghangPayPrice gonghangPayPrice = new GonghangPayPrice();
priceContext = new PriceContext(gonghangPayPrice);
System.out.println("price = "+ priceContext.price(originPrice)); // 結(jié)果:price = 99.90
}
}