【机房重构】——下机(策略模式+职责链模式)

【前言】

下机功能在整个机房收费系统中也算是一个难点吧,因为下机的过程中涉及到的表比较多,有不同的收费标志。针对这些要点,我分别采用了职责链模式来实现分段计费,策略模式来实现不同用户的收费标准。下面请看我一一道来。

 

【内容】

一、什么是策略模式

 

策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成形同的工作,但是实现不同,他可以以相同的方式调用所有算法,减少各种算法类与使用算法之间的耦合

关于策略模式的详情:请点击这里

 

二、什么是职责链模式

 

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

职责链模式的详情:请点击这里

 

三、具体实现B

BLL层

#region 策略模式
    public abstract class Spend
    {
        public abstract string acceptCash(Entity.DownLine downLine);
    }
    

    //计算一般用户金额
    public class FixedUser : Spend
    {

        public override string acceptCash(Entity.DownLine downLine)
        {
            #region  计算一般用户收费金额
            //计算上机时间
            TimeSpan ontime1 = Convert.ToDateTime(DateTime.Now.ToString())- Convert.ToDateTime(downLine.OnTime);

            //转化时间
            //double ontime2 = Convert.ToDouble(ontime1.TotalHours);
            //int time = Convert.ToInt32(ontime2 + 1);
            //downLine.SpendTime = Convert.ToString(time);
            //计算收费金额
            downLine.SpendMoney = Convert.ToString(Convert.ToInt32(downLine.SpendTime) * Convert.ToInt32(downLine.Rate));
            return Convert.ToString(downLine);
            #endregion

        }
    }
    //计算超级用户金额
    public class SuperUser : Spend
    {
        public override string acceptCash(Entity.DownLine downLine)
        {
            #region 超级用户金额
            //计算上机时间
            //TimeSpan ontime1 = Convert.ToDateTime(DateTime.Now.ToString()) - Convert.ToDateTime(downLine.OnTime);
            ////转换时间
            //double ontime2 = Convert.ToDouble(ontime1.TotalHours);

            //downLine.SpendTime = Convert.ToString(ontime2 + 1);
            
            downLine.SpendMoney = Convert.ToString(Convert.ToInt32(downLine.SpendTime) * Convert.ToInt32(downLine.TmpRate));
            return Convert.ToString(downLine);
            #endregion
        }
    }
    //下机处理职责链模式
    public abstract class OperateMoneyManager
    {
        protected OperateMoneyManager successor;
        //设置继承者
        public void SetSuccessor(OperateMoneyManager successor)
        {
            this.successor = successor;
        }
        //处理请求的抽象方法
        public FixedUser FixedUser = new FixedUser();
        public SuperUser SuperUser = new SuperUser();

        public abstract void GetMoney(Entity.DownLine downLine);
    }
    //具体策略
    public class OperateMoneyOne : OperateMoneyManager
    {
        public override void GetMoney(Entity.DownLine downLine)
        {
            //当上机时间小于准备时间,不收费
            if (Convert.ToDouble(downLine.SpendTime) <= Convert.ToDouble(downLine.PrepareTime))
            {
                downLine.SpendTime = Convert.ToString(0);
                downLine.SpendMoney = Convert.ToString(0);
            }
            else
            {
                successor.GetMoney( downLine);
            }
        }
    }
    public class OperateMoneyTwo : OperateMoneyManager
    {
        public override void GetMoney(Entity.DownLine downLine)
        {
            if (Convert.ToDouble(downLine.SpendTime) > (Convert.ToDouble(downLine.PrepareTime) / 60))
            {
                if (downLine.Type == "普通用户")
                {
                    FixedUser.acceptCash(downLine);//调用策略模式
                }
                else
                {
                    SuperUser.acceptCash(downLine);
                }
            }
            else
            {
                successor.GetMoney(downLine);
            }
        }
    }
    #endregion

Facade层

public void  Money(Entity.DownLine downLine)
        {
            //实例化具体策略
            BLL.OperateMoneyManager one = new BLL.OperateMoneyOne();
            BLL.OperateMoneyManager two = new BLL.OperateMoneyTwo();
           
            //设置职责链上家和下家
            one.SetSuccessor(two);
            //提交请求到 B层
            one.GetMoney(downLine);
          
           
        }

 UI层

 {
                //给上机表数据赋值
                Entity.DownLine downLine = new Entity.DownLine();
                Facade.DownLineFacade down = new Facade.DownLineFacade();
                downLine.CardNO = Convert.ToInt32( txtCardNO.Text.Trim());
                DataTable flag = down.FindOnLine(downLine);
                if (flag.Rows .Count ==0)
                {
                    MessageBox.Show("此卡号未上机","温馨提示",0,MessageBoxIcon.Warning);
                }
                else
                {

                    downLine.OnTime = flag.Rows[0][1].ToString();
                    downLine.Type = flag.Rows[0][2].ToString();
                    
                    downLine.Money = flag.Rows[0][3].ToString();
                    

                    DataTable flags = down.FindBasicdata(downLine);
                    if (flags .Rows.Count !=0)
                    {
                        //basicdata表信息
                        downLine.Rate =flags.Rows[0][0].ToString();
                        downLine.TmpRate = flags.Rows[0][1].ToString();
                        downLine.UnitTime = flags.Rows[0][2].ToString();
                        downLine.PrepareTime= flags.Rows[0][3].ToString();
                        downLine.LimitMoney =flags.Rows[0][4].ToString();
                        TimeSpan ontime1 = Convert.ToDateTime(DateTime.Now.ToString()) - Convert.ToDateTime(downLine.OnTime);

                        //转化时间
                        double ontime2 = Convert.ToDouble(ontime1.TotalHours);
                        int time = Convert.ToInt32(ontime2 + 1);
                        downLine.SpendTime = Convert.ToString(time);
                        //计算金额
                        Facade.DownLineFacade downs=new Facade.DownLineFacade();
                        downs.Money(downLine);

                        //修改mation金额
                        downLine.Money = Convert.ToString( Convert.ToInt32(downLine.Money) - Convert.ToInt32(downLine.SpendMoney));
                        bool flagss = down.UpdataMation(downLine);
                        if (flagss==true)
                        {
                            //删除上机表信息
                            bool delete = down.DeleteOnLine(downLine);
                            if (delete==true)
                            {
                                //添加纪录
                                downLine.OnTime=flag.Rows[0][1].ToString();
                                downLine.DownTime= DateTime.Now.ToString();
                                downLine.Computer = flag.Rows[0][4].ToString();
                                downLine.UserName = UserName;
                                bool insert = down.InsertDownLine(downLine);
                                if (insert==true)
                                {
                                    txtMoney.Text = downLine.Money;
                                    MessageBox.Show("退卡成功", "温馨提示", 0, MessageBoxIcon.Information);
                                    
                                }

                            }
                        }

                    }
                }
               

            }
            catch (Exception)
            {

                throw;
            }

【总结】

 

代码还是存在一定的冗余,在这期间看了很多博客和请教了很多人。希望对您有所帮助

猜你喜欢

转载自blog.csdn.net/damishidai15/article/details/84886212