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: