一:策略模式概念
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式中的角色描述:
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);//获取积分