机房重构-上下机(职责链模式和策略模式)

机房重构中上机功能相对好实现一些,下机用到了职责链模式和策略模式,职责链模式算时间,策略模式算消费金额

部分代码

DAL层

public class OffDAL:IOffIDAL
    {
        //查询card表
        public DataTable SelectCard(Card card)
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = { new SqlParameter("@CardNo", card.Cardno), };
            string sql = "SELECT*FROM Card WHERE cardNo=@CardNo";
            DataTable table = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);
            return table;
        }
        //查询student表
        public DataTable SelectStudent_Info(Student_Info student)
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = { new SqlParameter("@CardNo", student.Cardno), };
            string sql = "SELECT * FROM Student_Info Where cardNo=@CardNo"; //SQL语句查询
            DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
            return dt;//返回值
        }
        //查LineLog表
        public DataTable SelectLineLog(LineLog line)
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = { new SqlParameter("@CardNo", line.Cardno), };
            string sql = "SELECT * FROM LineLog Where cardNo=@CardNo"; //SQL语句查询
            DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
            return dt;//返回值
        }
        //查LineLog表,填充下机日期
        public DataTable SelectLineLog1(LineLog line)//下机
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = { new SqlParameter("@CardNo", line.Cardno), };
            string sql = "SELECT * FROM LineLog Where cardNo=@CardNo AND offDate IS NULL"; //SQL语句查询
            DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
            return dt;//返回值
        }
        
        public DataTable UpdateLineLog1(LineLog line)
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = {
                                        new SqlParameter("@CardNo",line.Cardno),//实例化字段穿参                                        
                                        new SqlParameter("@offdate",line.Offdate),
                                        new SqlParameter("@offtime",line.Offtime),
                                        new SqlParameter("@mins",line.Mins),
                                        new SqlParameter("@cash",line.Cash),
                                       };
            string sql = "UPDATE LineLog  SET cardNo=@CardNo, offDate=@offdate,offTime=@offtime,mins=@mins,cash=@cash WHERE cardNo=@CardNo"; //SQL语句查询
            DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
            return dt;//返回值
        }
        //下机,修改Card表
        public DataTable UpdateCard(Card card)
        {
            SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
            SqlParameter[] sqlParas = {
                                        new SqlParameter("@CardNo", card.Cardno),//实例化字段穿参
                                        new SqlParameter("@Cash", card.Balance),
                                       };
            string sql = "UPDATE Card SET Balance=Balance-@Cash WHERE cardNo = @CardNo"; //SQL语句查询
            DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
            return dt;//返回值
        }
    }

设计模式

namespace Design_pattern
{
    public class Context
    {
        private Strategy strategy;
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        public LineLog ContextInterface(LineLog line, BasicData basic)
        {
            strategy.Getconsum(line, basic);
            return line;
        }
    }
    public abstract class Strategy
    {
        //定义一个获得消费金额的抽象方法
        public abstract LineLog Getconsum(LineLog line, BasicData basic);
    }
    public class Strategyone : Strategy
    {
        public override LineLog Getconsum(LineLog line, BasicData basic)//临时用户消费金额
        {
            //获取临时用户单位消费金额
            line.Cash = (line.Mins * Convert.ToInt32(basic.TmpCash)).ToString();
            return line;
        }
    }

    public class Strategytwo : Strategy
    {
        public override LineLog Getconsum(LineLog line, BasicData basic)//固定用户消费金额
        {
            //获取固定用户单位消费金额
            line.Cash = (line.Mins * Convert.ToInt32(basic.FixCash)).ToString();//固定用户消费金额
            return line;
        }
    }
}

BLL层

namespace BLL
{
    public class OffBLL
    {
        public DataTable SelectLineLogConsumetime(LineLog line)
        {
            BasicData basic = new BasicData();
            OffFactory factory = new OffFactory();
            IOffIDAL off = factory.CreateOff();
            LineLog line1 = new LineLog();
            DataTable dt = off.SelectLineLog(line);
            BasicdataFactory factory1 = new BasicdataFactory();

            #region 职责链模式算时间
            //实体传值
            IBasicdataIDAL data = factory1.CreateUser();
            DataTable dt1 = data.ReadBasicData();
            basic.TmpCash = dt1.Rows[0][0].ToString();
            basic.FixCash = dt1.Rows[0][1].ToString();
            basic.Leasttime = Convert.ToInt32(dt1.Rows[0][3].ToString());
            basic.Readytime = Convert.ToInt32(dt1.Rows[0][4].ToString());
            basic.Limitcash = dt1.Rows[0][5].ToString();

            //调用职责链模式,计算花费时间 
            //创建具体的处理对象,实例化时就将"对象的具体执行者"传过去
            Design_patterns.Preparetime DP = new Design_patterns.Preparetime();
            Design_patterns.Consumetime DC = new Design_patterns.Consumetime();
            //从最开始的低层,设置上级
            DP.SetSuccessor(DC);
            //从链的最低层开始执行
            line1 = DP.GetcumeTime(basic, line1);
            line.Mins = line1.Mins;
            #endregion

            #region 策略模式算消费金额
            string type = line.Type;
            switch (type)
            {
                case "固定用户":
                    Context context = new Context(new Strategyone());
                    line = context.ContextInterface(line, basic);
                    break;

                case "临时用户":
                    Context context1 = new Context(new Strategytwo());
                    line = context1.ContextInterface(line, basic);
                    break;
            }
            #endregion

            return dt1;
        }

        public DataTable SelectCard(Card card)
        {
            OffFactory factory = new OffFactory();//实例化工厂
            IOffIDAL off = factory.CreateOff();
            DataTable dt = off.SelectCard(card);
            return dt;
        }

        //查学生表
        public bool SelectStudent_Info(Student_Info student)
        {
            OffFactory factory = new OffFactory();//实例化工厂
            IOffIDAL off = factory.CreateOff();
            DataTable dt = off.SelectStudent_Info(student);
            bool flag;
            //返回值是datatable的类型,如果行数为0,则没有符合该账号及密码的用户
            if (dt.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;//返回flag        
        }

        //查上机表
        public bool SelectLineLog(LineLog line)
        {
            BasicData basic = new BasicData();
            OffFactory factory = new OffFactory();//实例化工厂
            IOffIDAL off = factory.CreateOff();
            LineLog line1 = new LineLog();
            DataTable dt = off.SelectLineLog(line);
            bool flag1;
            //返回值是datatable的类型,如果行数为0,则没有符合该账号及密码的用户
            if (dt.Rows.Count == 0)
            {
                flag1 = false;
            }
            else
            {
                flag1 = true;
            }
            return flag1;//返回flag1
        }

        /// 
        /// 下机
        /// 
        ///
        ///
        //下机获取下机日期
        public Boolean GetoffDate(LineLog line)
        {
            OffFactory fact = new OffFactory();//实例化工厂
            IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
            DataTable dt = idal.SelectLineLog1(line);//接收D层的返回值
            bool flag2;
            if (dt.Rows.Count == 0)//不存在该卡号没有下机
            {
                flag2  = false;
            }
            else
            {
                flag2 = true;
            }           
            return flag2;
        }

        //更新机日期
        public DataTable UpdateoffDate(LineLog line)
        {
            OffFactory fact = new OffFactory();//实例化工厂
            IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
            DataTable dt = idal.UpdateLineLog1(line);//接收D层的返回值
            return dt;
        }

        //更新时间和余额
        public DataTable UpdateMins(LineLog line)
        {
            OffFactory fact = new OffFactory();//实例化工厂
            IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
            DataTable dt = idal.SelectLineLog1(line);//接收D层的返回值
            return dt;
        }
    }
}

UI层

#region 上机
        private void btnUp_Click(object sender, EventArgs e)
        {
            LineLog line = new LineLog();
            Card card = new Card();
            //定义一个bool类型的变量
            bool flag;
            bool flag1;
            bool flag2;

            UpFacade up = new UpFacade();
            card.Cardno = txtCardNo.Text.Trim();//定义参数,接收U层的控件的值
            line.Cardno = txtCardNo.Text.Trim();

            InqbalanceFacade inqbalance = new InqbalanceFacade();//实例化外观层
            DataTable table2 = new DataTable();//定义一个虚表变量
            table2 = inqbalance.SelectCard(card);//接收外观层的返回值

            line.Ondate = DateTime.Now.ToShortDateString();//实体,上机日期
            line.Ontime = DateTime.Now.ToLongTimeString().ToString(); //实体,上机时间
            //line.Type = table2.Rows[0]["Type"].ToString();

            DataTable dt = up.ReadCard(card);

            DataTable dt1 = up.Readoffdate(line);

            ///flag 查询卡表是否有该卡号
            ///flag1 查询LineLog表是否有该卡号
            ///dt 接收卡表的余额值
            ///dt1 接收LineLog表的offDate字段值
            ///table1 接收更新LineLog

            //接收外观层的返回值
            flag = up.SelectCard(card);
            flag1 = up.SelectLineLog(line);
            flag2 = up.SelectLineLogup(line);

            //判断返回值是否为false
            if (flag == false)
            {
                MessageBox.Show("没有这个卡号");
                return;
            }
            if (flag1 == false)//LineLog表里没有卡号
            {
                DataTable table1 = up.UpdateLineLog(line);
                DataTable table = new DataTable();//定义一个虚表变量
                table = inqbalance.SelectCard(card);//接收外观层的返回值
                txtCash.Text = table.Rows[0][2].ToString();
                MessageBox.Show("上机成功");
                return;
            }
            if (flag2 != false)//下机日期为空,不可以上机
            {
                MessageBox.Show("此卡号已上机");
                return;
            }
            if (Convert.ToInt32(dt.Rows[0][2]) <= 1)//余额不足
            {
                MessageBox.Show("余额不足,请及时充值");
                return;
            }
            else
            {
                DataTable table1 = up.UpdateLineLog(line);
                InqbalanceFacade inqbalance1 = new InqbalanceFacade();//实例化外观层
                DataTable table = new DataTable();//定义一个虚表变量
                table = inqbalance1.SelectCard(card);//接收外观层的返回值

                txtCash.Text = table.Rows[0][2].ToString();
            }
        }
        #endregion

        #region 下机
        private void btnDown_Click(object sender, EventArgs e)
        {
            //实例化实体
            Card card = new Card();
            LineLog line = new LineLog();
            BasicData basic = new BasicData();
            Student_Info student = new Student_Info();
           

            //接收U层值传入实体
            student.Cardno = txtCardNo.Text.Trim();
            line.Cardno = txtCardNo.Text.Trim();
            card.Cardno = txtCardNo.Text.Trim();

            //实例化外观层
            OffFacade off = new OffFacade();

            bool flag;
            flag = off.SelectStudent_Info(student);//接收F层布尔值
            //总时间=当前时间-上机时间
            line.Offdate = DateTime.Now.ToShortDateString();//实体,下机日期
            line.Offtime = DateTime.Now.ToLongTimeString().ToString(); //实体,下机时间
            DataTable dt3 = off.UpdateMins(line);
            if (flag == false)//学生表没有卡号
            {
                MessageBox.Show("没有这个卡号");
            }
            else
            {
                if (dt3.Rows.Count == 0)
                {
                    MessageBox.Show("该卡号没有上机", "提示");
                }
                else
                {
                    DateTime ontime = Convert.ToDateTime(dt3.Rows[0][2].ToString());
                    int datetime = ontime.Hour;//上机时间
                    int nowtime = DateTime.Now.Hour;//当前时间
                    BasicData basic1 = new BasicData();
                    DataTable dt4 = off.SelectCard(card);
                    card.Balance = dt4.Rows[0][2].ToString();

                    // 计算总时间
                    int mins = nowtime - datetime;
                    line.Mins = mins;
                    DataTable dt2 = off.SelectLineLogConsumetime(line);//运用职责链模式

                    //消费金额=消费总时间*单位消费金额
                    int fixrate = 2;
                    int balance = Convert.ToInt32(Convert.ToDouble(card.Balance));
                    int cash = Convert.ToInt32(mins * fixrate);
                    if (cash == 0)
                    {
                        int Banlance = balance - 2;
                        card.Balance = Banlance.ToString();
                        line.Cash = 0.ToString();//余额   
                    }
                }
                ///flag接收学生表是否有卡号
                ///flag1接收上机表是否有卡号
                ///flag3接收上机表下机日期是否为空

                //定义布尔变量
                
                bool flag1;
                
                flag1 = off.SelectLineLog(line);
                bool flag3 = off.GetoffDate(line);//接收B层offDate的值
                DataTable dt = off.UpdateoffDate(line);
                             
                    if (flag1 == false)//上机表没有卡号
                    {
                        MessageBox.Show("此卡号没有上机,请先上机");
                    }
                    else
                    {
                        if (flag3 == false)//不存在该卡号没有下机
                        {
                            MessageBox.Show("该卡号已下机");
                        }
                        else
                        {
                            MessageBox.Show("下机成功");
                            DataTable dt1 = off.UpdateoffDate(line);
                        }
                    }             
            }
        }
        #endregion

 

你可能感兴趣的:(电脑学习)