項目中用到的設計模式-策略模式


一:策略模式概念

      策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。

     策略模式中的角色描述:

     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);//獲取積分

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM