其他設(shè)計模式
java單例模式
java建造者模式
java策略模式
java代理模式
java觀察者模式
java適配器模式
java外觀模式
模式的定義
策略模式定義了一系列的算法题篷,并將每一個算法封裝起來雕沿,而且它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化凭迹。
使用場景
- 針對同一類型問題的多種處理方式罚屋,僅僅是具體行為有差別時。
- 需要安全的封裝多種同一類型的操作時嗅绸。
- 出現(xiàn)同一抽象多個子類脾猛,而又需要使用if-else 或者 switch-case來選擇時。
實現(xiàn)方式
舉例說明
A旗艦店除了正常日不打折鱼鸠,在節(jié)假日會推出滿300減100猛拴,全場8折等活動
步驟1:定義抽象策略角色(Strategy):現(xiàn)金收費(fèi)抽象類
abstract class CashSuper {
public abstract double acceptCash(double money);
}
步驟2:定義具體策略角色(Concrete Strategy):每個節(jié)日具體的促銷活動
正常收費(fèi)類
public class CashNormal extends CashSuper{
@Override
public double acceptCash(double money) {
return money;
}
}
打折收費(fèi)類
public class CashRebate extends CashSuper{
private double moneyRebate=1;
public CashRebate(double moneyRebate){
this.moneyRebate=moneyRebate; //如八折時,傳入0.8
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
滿減收費(fèi)類
public class CashReduce extends CashSuper{
private double moneyCondition=0;
private double moneyReduce=0;
public CashReduce(double moneyCondition, double moneyReduce) { //如滿300減100蚀狰,傳入300愉昆,100
this.moneyCondition = moneyCondition;
this.moneyReduce = moneyReduce;
}
@Override
public double acceptCash(double money) {
double result=money;
if (money>moneyCondition){//若大于滿減條件,減去滿減值
result=money-Math.floor(money/moneyCondition)*moneyReduce;
}
return result;
}
}
步驟3:定義環(huán)境角色(Context):用于連接上下文麻蹋,即把促銷活動推銷給客戶跛溉,這里可以理解為銷售員
public class CashContext {
private CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "normal":
CashNormal cashNormal = new CashNormal();
cs = cashNormal;
break;
case "rebate":
CashRebate cashRebate = new CashRebate(0.8);
cs = cashRebate;
break;
case "reduce":
CashReduce cashReduce = new CashReduce(300, 100);
cs = cashReduce;
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
步驟4:客戶端調(diào)用
public class SalesMan {
public static void main(String[] args) {
CashContext mSalesMan;
//平常不打折,消費(fèi)了1000
mSalesMan = new CashContext("normal");
double normalResult = mSalesMan.getResult(1000);
System.out.println("平常:" + normalResult);
//國慶打8折,消費(fèi)了1000
mSalesMan = new CashContext("rebate");
double rebateResult = mSalesMan.getResult(1000);
System.out.println("國慶:" + rebateResult);
//元旦滿30減100扮授,消費(fèi)了1000
mSalesMan = new CashContext("reduce");
double reduceResult = mSalesMan.getResult(1000);
System.out.println("元旦:"+reduceResult);
}
}
輸出結(jié)果
平常:1000.0
國慶:800.0
元旦:700.0
優(yōu)點:
- 結(jié)構(gòu)清晰明了芳室、使用簡單直觀。
- 耦合度相對而言較低刹勃,擴(kuò)展方便堪侯。
- 操作封裝也更為徹底,數(shù)據(jù)更為安全荔仁。
缺點:
- 隨著策略的增加伍宦,子類也會變得繁多芽死。