一:策略模式概念
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
策略模式中的角色描述:
1:環境角色(Context),持有一個角色類對像,或者接口對像
2:抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
3:具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。

二:需求描述
有一個商城項目,用戶付款完成,商城服務器收到支付寶或者微信支付回調接口推送,我們需要處理很多事務,比如:修改訂單表狀態,修改用戶積分等操作,用戶積分是通過多種方式產生的,比如第一次成功付款購物是雙倍,用戶等級如果是v1,積分是1倍,用戶等級是v2,積分是1.5倍等,如果是生日當天購物,積分是三倍等,獲取積分方式就可以用策略模式來完成。
三:代碼實現

a)環境角色類
public class ContextStrategy { private IintegralCompute integralCompute;//持有一個策略對像 public ContextStrategy(int key) { switch (key) { case NORMAL: integralCompute = new NormalOrderWork();//普通積分 break; case FIRST: integralCompute = new FirstOrderWork();//首單積分 break; case BIRTHDAY: integralCompute = new BirthdayOrderWork();//生日積分 break; } } public int getConsume(IntegralVo integralVo) { return integralCompute.getConsume(integralVo); } public static final int NORMAL = 0,FIRST=1,BIRTHDAY=2; }
b)策略接口
public interface IintegralCompute { //生日當月獲取積分倍數 final int BIRTHDAY_INTEGRAL = 1; //首單 final int FIRST_ORDER = 2; //得到當前確認付款訂單的積分 int getConsume(IntegralVo integralVo); }
c)具體策略類
//普通積分計算類 @Service("normalOrderWork") public class NormalOrderWork implements IintegralCompute { @Override public int getConsume(IntegralVo integralVo) { //返回正常購物贈送的積分 return 100; } } //當月首單類 @Service("firstOrderWork") public class FirstOrderWork implements IintegralCompute{ @Override public int getConsume(IntegralVo integralVo) {//返回當月首單消費贈送的積分
return 200;
}
} //生日積分類 @Service("birthdayOrderWork") public class BirthdayOrderWork implements IintegralCompute { @Override public int getConsume(IntegralVo integralVo) { //返回生日當天消費贈送的積分 return 300; } }
d:)調用獲取積分的地方
//默認正常獲取
ContextStrategy contextStrategy = new ContextStrategy( ContextStrategy.NORMAL); if (this.isFirstOrder(dao, orderVo.getUser_id())) {//判斷是否為首單 contextStrategy = new ContextStrategy(ContextStrategy.FIRST); } else if (this.isBirthdayMonthAddOrder(dao, orderVo, userInfo)) {//判斷是否為當前首次消費 contextStrategy = new ContextStrategy(ContextStrategy.BIRTHDAY); } int integral = contextStrategy.getConsume(integralVo);//獲取積分
