假設(shè)現(xiàn)在要設(shè)計(jì)一個(gè)販賣(mài)各類(lèi)書(shū)籍的電子商務(wù)網(wǎng)站的購(gòu)物車(chē)系統(tǒng)。一個(gè)最簡(jiǎn)單的情況就是把所有貨品的單價(jià)乘上數(shù)量,但是實(shí)際情況肯定比這要復(fù)雜。比如,本網(wǎng)站可能對(duì)所有的高級(jí)會(huì)員提供每本20%的促銷(xiāo)折扣;對(duì)中級(jí)會(huì)員提供每本10%的促銷(xiāo)折扣;對(duì)初級(jí)會(huì)員沒(méi)有折扣。
根據(jù)描述,折扣是根據(jù)以下的幾個(gè)算法中的一個(gè)進(jìn)行的:
算法一:對(duì)初級(jí)會(huì)員沒(méi)有折扣。
算法二:對(duì)中級(jí)會(huì)員提供10%的促銷(xiāo)折扣。
算法三:對(duì)高級(jí)會(huì)員提供20%的促銷(xiāo)折扣。
public interface DiscountStrategy {
/**
* 折扣策略
* @param booksPrice 圖書(shū)的原價(jià)
* @return 計(jì)算出打折后的價(jià)格
*/
public double calcPrice(double booksPrice);
}
初級(jí)會(huì)員
public class PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
return booksPrice;
}
}
中級(jí)會(huì)員
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
return booksPrice * 0.9;
}
}
高級(jí)會(huì)員
public class AdvancedMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
return booksPrice * 0.8;
}
}
價(jià)格類(lèi)
public class Price {
//持有一個(gè)具體的策略對(duì)象
private MemberStrategy strategy;
/**
* 構(gòu)造函數(shù),傳入一個(gè)具體的策略對(duì)象
* @param strategy 具體的策略對(duì)象
*/
public Price(MemberStrategy strategy){
this.strategy = strategy;
}
public void setPrice(MemberStrategy strategy){
this.strategy = strategy;
}
/**
* 計(jì)算圖書(shū)的價(jià)格
* @param booksPrice 圖書(shū)的原價(jià)
* @return 計(jì)算出打折后的價(jià)格
*/
public double quote(double booksPrice){
return this.strategy.calcPrice(booksPrice);
}
}
調(diào)用:
public class Client {
public static void main(String[] args) {
//選擇并創(chuàng)建需要使用的策略對(duì)象
MemberStrategy strategy = new IntermediateMemberStrategy();
Price price = new Price(strategy);
//計(jì)算價(jià)格
double quote = price.quote(300);
System.out.println("圖書(shū)的最終價(jià)格為:" + quote);
}
}
策略模式的重心不是如何實(shí)現(xiàn)算法,而是如何組織、調(diào)用這些算法,從而讓程序結(jié)構(gòu)更靈活,具有更好的維護(hù)性和擴(kuò)展性。