1. 程式人生 > >策略模式——商品促銷

策略模式——商品促銷

許多商家為了提高知名度或是其他原因會進行商品促銷活動。而有時對於新老客戶的促銷策略又有所不同。比如新客戶打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);
    }
}

策略模式的優缺點

  • 優點
    • 結構清晰,容易擴充套件,耦合度低,體現了單一職責的設計原則。
  • 缺點
    • 使用的子類會增多。