【机房合作】职责链模式计算消费时间

       先说一下机房收费系统中为什么要有消费时间计算这个问题,首先学生上机应该有一个准备时间,这段时间短短几分钟,可以不收费的;其次还要有一个最少上机时间,也就相当于打车时的起步价一样,收一个固定费用;再最后就是单位递增时间了,可以10分钟、30分钟或一小时等等,也就是多长时间给用户计算一次费用。

       根据以上需求,这是一个依次递进的过程,准备时间——最少上机时间——单位递增时间,这样就形成了一条职责链。

       职责链模式

       使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并延着这条链传递该请求,直到有一个对象处理它为止。

       好处:

       1、职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用,大大降低耦合度;

       2、链的结构是在客户端来定义,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

       结构图如下:


        Handler类

public abstract class TimeHandler
    {
        protected TimeHandler successor;
        //设置继任者
        public void SetSuccessor(TimeHandler successor)
        {
            this.successor = successor;
        }
        //处理请求的抽象方法
        public abstract int HandleTimeRequest(int time);
    }
        具体处理者类

public class LeastTimeHandler : TimeHandler  //继承TimeHandler类
    {
        public override int HandleTimeRequest(int time)
        {
            BasicDataEntity BasicData = new BasicDataEntity();  //实例化一个实体类
            Factory.FactoryDB factory = new Factory.FactoryDB();  //实例化工厂
            IBasicData IBasicData = factory.CreateIBasicData();   //通过接口调用D层方法
            List<BasicDataEntity> list = IBasicData.InquireBasicData(BasicData);
            int leastTime = list[0].LeastTime;

            if (time <= leastTime)  //如果上机时间小于等于最少上机时间
            {
                return time;
            }
            else
            {
                return successor.HandleTimeRequest(time);  //转移到下一位
            }
        }
    }

    public class UnitTimeHandler : TimeHandler  //继承TimeHandler类
    {
        public override int HandleTimeRequest(int time)
        {
            BasicDataEntity BasicData = new BasicDataEntity();  //实例化一个实体类
            Factory.FactoryDB factory = new Factory.FactoryDB();  //实例化工厂
            IBasicData IBasicData = factory.CreateIBasicData();  //通过接口调用D层方法
            List<BasicDataEntity> list = IBasicData.InquireBasicData(BasicData);
            int unittime = list[0].UnitTime;
            return time =Convert.ToInt32(Math.Ceiling((double)time / (double)unittime) * unittime);
        }
    }
       调用:

public int CostTime(LineInfoEntity LineInfo, BasicDataEntity BasicData)
        {
            //实例化具体处理者类
            LeastTimeHandler LeastTime = new LeastTimeHandler();  
            UnitTimeHandler AddTime = new UnitTimeHandler();
            //设置职责链上家与下家
            LeastTime.SetSuccessor(AddTime);

            DateTime dt = LineInfo.OnDate + LineInfo.OnTime;
            TimeSpan ts = DateTime.Now - dt;
            int minute = Convert.ToInt32(ts.TotalMinutes);
            //将消费时间交给职责链去处理
            return LeastTime.HandleTimeRequest(minute);
        }
          其实这里只有一个最少上机时间判断,不去套用职责链模式会更加简单,但毕竟还是一只小菜鸟,能够去用、去学习还是有很大收获的,手中无剑、心中有剑的境界以后会慢慢达到的,加油!



你可能感兴趣的:(【机房合作】职责链模式计算消费时间)