1. 程式人生 > >大話設計模式筆記(二)——商品促銷 策略模式

大話設計模式筆記(二)——商品促銷 策略模式

第二章商品促銷——策略模式

需求:商品價格計算,並增加折扣條件

工廠模式UML圖

在工廠模式中,呼叫端程式碼會通過折扣工廠類生成折扣物件,折扣物件呼叫折扣方法。這裡關聯了兩個類,工廠類和抽象折扣類。

策略模式UML圖


在策略模式中,會在策略環境類的構造器中完成折扣類的初始話,並在策略環境的實現方法呼叫折扣類的折扣演算法。這樣呼叫類只會關聯策略環境類。

簡單工廠模式需要的是生成的物件,所以在客戶端程式碼中會存在工廠類和生成類,而策略模式關注的是相應演算法,它並不關注演算法類物件,所以在客戶端程式碼中只會存在context環境類。這樣降低程式碼耦合度。

程式碼

Context

public class SaleContext {

    private SaleStrategy saleStrategy = null;

    public SaleContext(String saleSelector) {
        switch (saleSelector) {
            case "打9折":
                this.saleStrategy = new PercentSaleStrategy(0.9);
                break;
            case "打8折":
                this.saleStrategy = new PercentSaleStrategy(0.8);
                break;
            case "滿300減100":
                this.saleStrategy = new FullSendSaleStrategy(300, 100);
                break;
            default:
                this.saleStrategy = new NormalStrategy();
                break;
        }
    }

    public double contextInterface(double money) {
        return saleStrategy.getSaleMoney(money);
    }

}

SaleStrategy

abstract class SaleStrategy {
    public abstract double getSaleMoney(double money);
}

PercentSaleStrategy(折扣促銷)

class PercentSaleStrategy extends SaleStrategy {

    private double pecent = 0.0d;

    public PercentSaleStrategy(double pecent) {
        this.pecent = pecent;
    }

    @Override
    public double getSaleMoney(double money) {
        return money * pecent;
    }
}

FullSendSaleStrategy(滿減促銷)

class FullSendSaleStrategy extends SaleStrategy {

    private double fullMoney = 0.0d;
    private double sendMonty = 0.0d;

    public FullSendSaleStrategy(double fullMoney, double sendMonty) {
        this.fullMoney = fullMoney;
        this.sendMonty = sendMonty;
    }

    @Override
    public double getSaleMoney(double money) {
        return money > fullMoney ? (money - sendMonty) : money;
    }
}

總結

策略模式是定義了一系列演算法,這些演算法從層次上實現相同的功能,最好析取出演算法層,可以減少演算法之間和呼叫演算法的耦合。

在實際工作中,當聽到需求中包含在不同時間應用不同業務規則,就可以考慮使用策略模式。

設計模式的核心思想就是對介面程式設計,封裝變化。

應用場景

只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式。