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

Posted 山城码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中用到的设计模式-策略模式相关的知识,希望对你有一定的参考价值。

一:策略模式概念

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

     策略模式中的角色描述:

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

 

以上是关于项目中用到的设计模式-策略模式的主要内容,如果未能解决你的问题,请参考以下文章

项目中用到的设计模式-观察者模式

深入解析spring中用到的九种设计模式

spring中用到的设计模式

转载OGRE中用到的设计模式

spring中用到的设计模式

spring中用到的设计模式