码迷,mamicode.com
首页 > 其他好文 > 详细

项目中用到的设计模式-策略模式

时间:2017-10-07 16:27:34      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:tco   操作   put   状态   一个   生日   inf   ima   add   

一:策略模式概念

      策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

     策略模式中的角色描述:

     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);//获取积分

 

项目中用到的设计模式-策略模式

标签:tco   操作   put   状态   一个   生日   inf   ima   add   

原文地址:http://www.cnblogs.com/cq-jiang/p/7634358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!