初識-設計模式二 策略模式

package com.mybatis.Strategist;

public class Cash {
    /**
     * 收銀系統:
     * 需求:1.客戶買賣東西正常收費
     *      2.打折收費
     *      3.返利
     * @param args
     */
    public static void main(String[] args) {
        String type = "正常收費";
        String type2 = "打折";
        String type3 = "促銷";
       CashContext cashContext = new CashContext(type2);
        System.out.println(cashContext.getResult(100D));
    }


}
package com.mybatis.Strategist;

public class CashContext {
    private CashSuper cashSuper  =  null ;
    public CashContext(String type){
        switch (type){
            case "正常收費":
                cashSuper = new CashNormal();
                break;
            case "打折":
                cashSuper = new CashDiscount(0.8);
                break;
            case "促銷":
                cashSuper = new CashPromotion(300D,100D);
                break;
            default:
                System.out.println("輸入有誤");
        }
    }
    public Double getResult(Double money){
               return cashSuper.acceptCash(money);
    }
}
package com.mybatis.Strategist;

/**
 * 收費超類
 */
abstract class CashSuper {
    public abstract Double acceptCash(Double money);
}
package com.mybatis.Strategist;

public class CashNormal extends CashSuper {
    @Override
    public Double acceptCash(Double money) {
        return money;
    }
}

 

package com.mybatis.Strategist;

/**
 * 打折
 */
public class CashDiscount extends CashSuper{
    private Double discount  = 1D; //默認不打折
    public CashDiscount(Double discount) {
        this.discount = discount;
    }
    @Override
    public Double acceptCash(Double money){
        return money * discount;
    }
}
package com.mybatis.Strategist;

/**
 * 促銷
 */
public class CashPromotion extends CashSuper{
    private Double promotionPrivate; // 促銷價格
    private Double promotionRebate;  // 返利

    public CashPromotion(Double promotionPrivate, Double promotionRebate) {
        this.promotionPrivate = promotionPrivate;
        this.promotionRebate = promotionRebate;
    }

    @Override
    public Double acceptCash(Double money) {
        if (money >= promotionPrivate){
            return money - money / promotionPrivate * promotionRebate;
        }
        return money; // 收原價
    }

}

感受:感覺簡單工廠和策略模式很像,傻傻分不清;明白的一點就是策略模式耦合性更低,策略模式返回的是策略的上下文,而工廠模式返回的是本身對象

網上看到一些博主分析簡單工廠和策略區別:

簡單的說,

1、工廠模式根據條件生產出產品給客戶端用。而策略模式是客戶端使用傳參給Context的策略(你也可以理成產品),傳入策略的不同,調用同樣方法得到的結果也不同。

2、工廠模式:客戶端是使用工廠類生產的對象進行操作,策略模式:客戶端使用自己傳給Context的策略的對象進行操作。

簡單工廠UML: 

 

策略UML: 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章