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


    一:策略模式概念

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

         策略模式中的角色描述:

         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);//获取积分
  • 相关阅读:
    [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题
    [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单
    [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
    [c/c++] programming之路(27)、union共用体
    [c/c++] programming之路(26)、结构体
    opencv学习之路(37)、运动物体检测(二)
    [Python]基础教程(4)、Python 变量类型
    opencv学习之路(36)、运动物体检测(一)
    opencv学习之路(35)、SURF特征点提取与匹配(三)
    opencv学习之路(34)、SIFT特征匹配(二)
  • 原文地址:https://www.cnblogs.com/cq-jiang/p/7634358.html
Copyright © 2020-2023  润新知