【Dongle】【机房合作】下机之职责链模式

       机房合作下机之职责链模式

       首先需要获得消费时间,由上机时间和下机时间可以获得,这不是难点。而我们计算下机结账的时候使用的职责链模式,理由就是不同分段的时间由不同的消费标准,通过传时间参数,依次处理,并得到最后的结果返回。(前提获取基本数据)

      例如在准备时间内,是不收费的,即消费为0:

public class BLL_PrepareHandler : BLL_TimeHandler
    {
        
        /// <summary>
        /// 返回计算消费金额
        /// </summary>
        /// <param name="M_Online"></param>
        /// <param name="M_BasicData"></param>
        public override decimal CountCash(int time, decimal  cash)
        {
            decimal count = 0.0M;//定义一个消费金额
            //减去准备时间再计算
            time = time - model.BasicData.BdPrepareTime;
            //判断消费时间是否大于准备时间(即>0),则移交给下一级
            if (time > 0)
            {
                //消费大于准本时间,转交到上级,BLL_LeastHandler
                if (superior != null)
                {
                   count = superior.CountCash(time, cash);
                }
            }
            return count;
        }

    }

      如果上机时间超过准备时间,则将时间减去准备时间,剩下的时间传给至少上机时间,由至少上机时间处理方法处理:

public class BLL_LeastHandler : BLL_TimeHandler
    {  
        /// <summary>
        /// 返回计算消费金额
        /// </summary>
        /// <param name="M_Online"></param>
        /// <param name="M_BasicData"></param>
        public override decimal  CountCash(int time, decimal  cash)
        {
            decimal count = 0.0M;//定义一个消费金额

            //判断消费时间是否不大于最少上机时间,否则移交给下一级
            if (time <= model.BasicData.BdLeastTime)
            {
                //消费时间不大于最少上机时间,收取一个递增时间的费用
                count =Convert .ToDecimal ( cash /(60/model.BasicData .BdUpTime)) ;
            }
            else
            {
                //消费大于最少上机时间,转交到上级,BLL_LeastHandler
                if (superior != null)
                {
                  count=superior.CountCash(time, cash);
                }
            }
            return count;
        }

    }

       如果上机时间超过了最少上机时间,则按正常标准来计算消费:

public class BLL_OverTimeHandler : BLL_TimeHandler
    {
        /// <summary>
        /// 返回计算消费金额
        /// </summary>
        /// <param name="M_Online"></param>
        /// <param name="M_BasicData"></param>
        public override decimal CountCash(int time, decimal  cash)
        {
            decimal count = 0.0M;//定义一个消费金额
            int hour = 0;//定义小时个数
            int min = 0;//定义除开小时外剩余分钟
            int upNum = 0;//定义剩余分钟数存在的递增时间个数
            int least = 0;//定义剩余分钟数小于递增时间
            decimal  upcash= cash /(60/model.BasicData .BdUpTime);//定义递增时间的消费费用

            hour = time / 60;
            min = time % 60;
            upNum = min / model.BasicData.BdUpTime;
            least = min % model.BasicData.BdUpTime;

            //判断是否存在小于递增时间的分钟
            if (least ==0)
            {
                //不存在小于递增时间的分钟数
                count = Convert.ToDecimal(cash * hour+upcash *upNum );
            }
            else
            {
                //存在小于递增时间的分钟数,再加一个递增时间的消费
                count = Convert.ToDecimal(cash * hour + upcash * (upNum + 1));
            }           
            return count;
        }
    }


       最后得到时间对应的消费金额,从而返回,告知用户消费金额。这里使用职责链模式而不用策略模式的原因在于:必须通过准备时间的处理才能进入至少上机时间的处理,必须通过至少上机时间的处理才能得到正常标准的处理。而一旦期间可以独自处理,则没必要通过下一级就可以直接返回。就犹如员工请假,如果项目经理能决定的,就不必上交给总经理,而只有项目经理不能决定的时候才交由总经理处理。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值