项目中用到的设计模式-策略模式
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);//获取积分
以上是关于项目中用到的设计模式-策略模式的主要内容,如果未能解决你的问题,请参考以下文章