机房合作-策略模式实现用户充值

简介: 机房合作-策略模式实现用户充值

策略模式实现用户充值

一、概念

①什么是策略模式?

Strategy:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。

②如何使用策略模式?

将每个算法都封装起来、定义一个策略类并且在策略类中定义一个所有算法的公共接口、定义一个context类用来维护对strategy对象的引用。

③为什么要使用策略模式?

策略模式可以解决多重条件语句的问题,易于维护。

类图



实战、策略模式实现用户充值

类图



代码实现

Context类

public class Context
    {
        RechargeStrategy strategy;
        //通过构造方法传入具体的收费策略
        public Context (RechargeStrategy strategy)
        {
            this.strategy = strategy;
        }
        //根据收费策略返回不同的结果
        public decimal ContextInterface(decimal money )
        {
           return  strategy.Recharge(money);
        }
    }

RechargeStrategy类

 abstract   public class RechargeStrategy
    {
        //充值金额抽象类
        public abstract decimal Recharge(decimal money);
    }

StrategyReturn类

/// <summary>
      /// 满赠类
      /// </summary>
    public class StrategyReturn:RechargeStrategy
    {
        private decimal moneyCondition;
        private decimal moneyReturn;
        /// <summary>
        /// 初始化时输入的赠送条件和赠送值
        /// </summary>
        /// <param name="moneyCondition">赠送条件</param>
        /// <param name="moneyReturn">赠送值</param>
        public StrategyReturn(decimal moneyCondition,decimal moneyReturn)
        {
            this.moneyCondition = moneyCondition;
            this.moneyReturn = moneyReturn;
        }
        /// <summary>
        /// 计算返利数值
        /// </summary>
        /// <param name="money">充值金额</param>
        /// <returns></returns>
        public override decimal Recharge(decimal money)
        {
            decimal result = money;
            //若大于赠送条件则加上赠送金额
            if (money>=moneyCondition)
                result = money +Math.Floor(money / moneyCondition) * moneyReturn;
                return result;
        }
    }

业务逻辑实现层

public class RechargeBLL
    {
        //实例化WCF代理服务对象
        DateBaseServiecClient client = new DateBaseServiecClient();
        /// <summary>
        /// 充值
        /// </summary>
        /// <param name="recharge">基本信息实体</param>
        /// <param name="value">满赠条件</param>
        /// <returns></returns>
        public CustomerModel Recharge(string id, decimal charge,string giveInfo)
        {
            //声明一个RechargeModel对象
            RechargeModel rechargeModel = new RechargeModel();
            CustomerModel customer = client.SelectCustomerExist(id);
            PriceModel priceInfo = client.SelectPrice();
                //策略模式声明一个Context对象
                Strategy.Context context = null;
                //根据用户选择的满赠条件,进行相应的策略
                switch (giveInfo )
                {
                    case "50送20":
                        //通过构造方法传入具体的收费策略
                        context = new Strategy.Context(new Strategy.StrategyReturn(50, 20));
                        break;
                    case "100送50":
                        context = new Strategy.Context(new Strategy.StrategyReturn(100, 50));
                        break;
                }
                //根据不同的收费策略计算不同的结果
                decimal money = context.ContextInterface(charge );
                //通过总金额-充值金额的出赠送金额
                decimal giveMoney = money - charge;
                //金额汇总
                decimal allMoney = customer.balance + money;
                //修改用户表余额
                client.UpdateBalance(id , allMoney);
                //赋值赠送金额
                rechargeModel.giveMoney = giveMoney;
            }
            else
            {
                if (charge.ToString() == "")
                {
                    throw new Exception("请输入充值金额");
                }
                // 赠送金额为零
                rechargeModel.giveMoney = 0;
                //总金额
                decimal allMoney = charge + customer.balance;
                //修改用户表余额
                client.UpdateBalance(id , allMoney);
            }
            //赋值当前操作员卡号
            rechargeModel.managerID = StaticManager.managerID;
            //rechargeModel.managerID = recharge.managerID;
            //赋值充值金额
            rechargeModel.charge = charge;
            //赋值当前充值卡号
            rechargeModel.userID = id ;
            //赋值未结账状态
            rechargeModel.checkStatus = false;
            //赋值当前充值日期和时间
            rechargeModel.time = DateTime.Now;
            //向充值表中插入一条充值记录
            client.InsertRecharge(rechargeModel);
            CustomerModel customerInfo = new CustomerModel();
            //返回用户表信息
           customerInfo = client.SelectCustomerExist(id );
            return customerInfo;
        }
目录
相关文章
|
6月前
|
数据库 网络架构 UED
支付设计白皮书:支付系统的路由系统设计
支付设计白皮书:支付系统的路由系统设计
212 1
机房合作-职责链模式实现用户登陆
机房合作-职责链模式实现用户登陆
56 1
机房合作-职责链模式实现用户登陆
|
存储 安全 数据挖掘
外卖跑腿/同城跑腿/校园跑腿/同城配送外卖系统开发规则玩法/案例设计/逻辑方案/需求程序/源码
外卖跑腿、同城跑腿、校园跑腿和同城配送外卖系统开发,是指开发一个用于管理和协调外卖送餐和快递物品的平台或应用程序。该系统能够连接顾客、骑手和商家,提供顾客下单、骑手接单、派送商品等功能。
|
数据可视化 API
电商收付通,多服务商模式
当把服务商信息新增好后,在给二级商户进件时,就可以通过选择服务商的形式,来告诉系统当前应该获取选中的服务商参数信息来调用接口进行进件。后续的操作比如合单支付、分账、提现、退款等和支付有关的很清楚如何操作了。
213 0
电商收付通,多服务商模式
|
存储 消息中间件 安全
老板:公司系统太多,能不能实现账号互通?(一)
最近开发新产品,然后老板说我们现在系统太多了,每次切换系统登录太麻烦了,能不能做个优化,同一账号互通掉。作为一个资深架构狮,老板的要求肯定要满足,安排!
老板:公司系统太多,能不能实现账号互通?(一)
|
安全 NoSQL Redis
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
|
存储 设计模式 运维
预算管控服务(库存和产品账平台)的DDD设计案例
一. 背景     本文预算管控服务建设作为一个DDD设计的例子介绍,目标是是呈现一次DDD设计的过程,为了减少绘图和描述的工作量,文中会对预算管控业务需求和功能做简化。请重点关注设计的流程,这是我们想传达的重点,忽略设计细节的合理性。另外,对于预算管控服务来讲,不一定要用DDD来进行分析设计,基于传统的数据驱动就完全可以满足需求,但作为介绍DDD实施过程,预算管控是一个不错的例子(不需要画太多的
614 0
预算管控服务(库存和产品账平台)的DDD设计案例
|
安全 开发者
新能力|分账明白,账本清楚,商家超轻松
目前,商家分账 功能已经全面开放给企业商户,快来了解一下吧。
2499 12
新能力|分账明白,账本清楚,商家超轻松
|
小程序 Serverless API
云上开发花呗支付小程序
本文将介绍如何使用小程序Serverless云调用开发一个具有花呗支付能力的小程序。
云上开发花呗支付小程序
【重要】支付宝用户增长拉新促活协作费线上激励方案升级公告
尊敬的合作伙伴,您好! 非常感谢大家对支付宝用户增长拉新促活业务的关注和支持,为了更好的服务于合作伙伴,激励合作伙伴开展业务,支付宝决定将原《支付宝用户增长拉新促活协作费线上激励方案公告 (2018年02版)》的协作费政策做进一步优化升级。
970 12