策略模式——商品促銷
阿新 • • 發佈:2019-01-09
許多商家為了提高知名度或是其他原因會進行商品促銷活動。而有時對於新老客戶的促銷策略又有所不同。比如新客戶打9折,老客戶打8折。(當然,這只是比喻)我們可以用簡單的程式來表示這種促銷活動。
public class Merchandise {
//新客戶
public final static int NEW_CUSTOMER = 0;
//老客戶
public final static int OLD_CUSTOMER = 1;
public static void main(String[] args) {
Merchandise merchandise = new Merchandise();
float price = 90l;
System.out.println(merchandise.calculatePrice(NEW_CUSTOMER, price));
System.out.println(merchandise.calculatePrice(OLD_CUSTOMER, price));
}
//根據型別計算商品價格
public float calculatePrice(int customer, float price) {
if (customer == NEW_CUSTOMER) {
return newCustomerPrice(price);
} else if (customer == OLD_CUSTOMER) {
return oldCustomerPrice(price);
}
return price;
}
//計算新客戶價格
public float newCustomerPrice(float price) {
return (float) (price * 0.9);
}
//計算老客戶價格
public float oldCustomerPrice (float price) {
return (float) (price * 0.8);
}
}
一個簡單的程式就出來了:
81.0
72.0
但是,這卻隱藏著一個問題,假設現在老闆說有一種特殊的客戶,可以打5折。現在要修改程式,就需要新增多一個if判斷了:
public float caculatePrice(int customer, float price) {
if (customer == NEW_CUSTOMER) {
return newCustomerPrice(price);
} else if (customer == OLD_CUSTOMER) {
return oldCustomerPrice(price);
} else if (customer == SPECIAL_CUSTOMER) {
return specialCustomerPrice(price);
}
return price;
}
會發現,如果老闆說又多了一種客戶,就會在程式中多出現一個if else語句,導致程式顯得越來越臃腫。既然對於每種客戶都採取不同的策略,那麼接下來用策略模式來解決上述問題。
UML圖:
Context:操縱策略的環境
Strategy:策略的抽象
ConcreteStragety:策略的具體實現
按照圖示,可以嘗試先定義一個介面,用來計算價格:
//計算價格的介面,對應Strategy
public interface CaculateStrategy {
/**
* 計算價格
* @param price
* @return
*/
float caculatePrice(float price);
}
分別有新老,特殊三種客戶,並且都實現了計算價格的介面:
//新客戶價格策略,對應ConcreteStrategyA
public class NewCustomer implements CaculateStrategy{
@Override
public float caculatePrice(float price) {
return (float) (price * 0.9);
}
}
//老客戶價格策略,對應ConcreteStrategyB
public class OldCustomer implements CaculateStrategy{
@Override
public float caculatePrice(float price) {
return (float) (price * 0.8);
}
}
有了客戶,最後需要一個價格計算器:
//價格計算,對應Context
public class PriceCalculator {
CaculateStrategy strategy;
public static void main(String[] args) {
PriceCalculator calculator = new PriceCalculator();
//設定價格策略
OldCustomer oldCustomer = new OldCustomer();
calculator.setStrategy(oldCustomer);
System.out.println("老客戶:" + calculator.calculatePrice(90l));
}
public void setStrategy(CaculateStrategy strategy) {
this.strategy = strategy;
}
public float calculatePrice(float price) {
return strategy.caculatePrice(price);
}
}
結果:
老客戶:72.0
用上述方式,如果要新增一個特殊客戶,就會顯得輕便許多,省去了if else的臃腫邏輯:
public class SpecialCustomer implements CaculateStrategy{
@Override
public float caculatePrice(float price) {
return (float) (price * 0.5);
}
}
策略模式的優缺點
- 優點
- 結構清晰,容易擴充套件,耦合度低,體現了單一職責的設計原則。
- 缺點
- 使用的子類會增多。