【机房重构】责任链模式+策略模式--下机

版权声明:本文为Banana原创文章,未经Banana允许不得转载。评论请留下你认真观看后的想法或者意见,非常感谢! https://blog.csdn.net/qq1515312832/article/details/79365527

前言

总感觉我的责任链模式+策略模式完成的下机跟别人不一样,不过要说哪里不一样也还真的说不出来,但是我觉得我这样用着也还不错,代码思路也足够清晰,然后我就跟大家介绍一下吧。

没用设计模式的时候

我使用了存储过程来实现的下机,同时会更新三个表,所以存储过程更加方便

没有加设计模式的时候代码轰轰烈烈这么一大段,加了设计模式之后就把算钱的一部分全部都去掉了

        public IList<CardModel.Lines> OffLine(string cardno)
        {

            string sql = "select * from Online_Info where CardNo = '" + cardno + "'";
            DataTable dt = sqlhelper.ExecuteQuery(sql, CommandType.Text);
            IList<CardModel.Lines> line = ConvertHelper<CardModel.Lines>.ConvertToModel(dt);

            DateTime datetime = sqlhelper.GetTimeFromSQL();
            line[0].Offdate = datetime.ToShortDateString().ToString();
            line[0].Offtime = datetime.ToShortTimeString().ToString();

            //获取余额
            string cashsql = "select * from view_stucard where CardNo = '" + cardno + "'";
            DataTable cashdt = sqlhelper.ExecuteQuery(cashsql, CommandType.Text);
            IList<CardModel.StuCard> stucard = ConvertHelper<CardModel.StuCard>.ConvertToModel(cashdt);
            double oldCash = Convert.ToDouble(stucard[0].Cash);

            //-----------------------我是算钱的代码--------------------------------------------

            #region 算钱

            string sqlbasicdata = "select * from BasicData_info where serial = (select max(Serial) from BasicData_info)";//找到编号最大(也就是最新的)的记录
            DataTable basicdatadt = sqlhelper.ExecuteQuery(sqlbasicdata, CommandType.Text);
            IList<BasicDataModel.BasicData> bd = LoginDAL.ConvertHelper<BasicDataModel.BasicData>.ConvertToModel(basicdatadt);


            #region spendtime:花费时长
            DateTime ondatetime = Convert.ToDateTime(line[0].OnDate.Split(' ')[0] + " " + line[0].OnTime);
            DateTime offdatetime = datetime;
            double SpendTime = (offdatetime - ondatetime).TotalHours;
            #endregion
            //花费时间
            double CostTime = SpendTime;
            //递增单位时间
            double PerTime = Convert.ToDouble(bd[0].UnitTime) / 60;
            //单位时长的钱
            int PerMoney = (line[0].CardType == "一般用户") ? Convert.ToInt32(bd[0].Rate) : Convert.ToInt32(bd[0].TmpRate);
            //准备时间
            double MinTime = Convert.ToDouble(bd[0].PrepareTime) / 60;
            //花费金额
            int Cost = 0;

            if (SpendTime > MinTime)
            {
                while (SpendTime > 0)
                {
                    SpendTime -= PerTime;
                    Cost += PerMoney;
                }
            }

            #endregion

            //--------------------------我算完钱了-----------------------------------------

            double newCash = oldCash - Convert.ToDouble(line[0].Consume);

            line[0].Consume = Cost.ToString();
            line[0].ConsumeTime = CostTime.ToString();
            line[0].Cash = newCash.ToString();
            line[0].Status = "正常下机";

            SqlParameter[] sqlparas = {//将存储过程中的名字与程序中的名字对应起来
                    new SqlParameter("@CardNo",line[0].CardNo),
                    new SqlParameter("@StuNo",line[0].StuNo),
                    new SqlParameter("@Date",line[0].Date),
                    new SqlParameter("@Type",line[0].CardType),
                    new SqlParameter("@StuName",line[0].StuName),
                    new SqlParameter("@Sex",line[0].Sex),
                    new SqlParameter("@Department",line[0].Department),
                    new SqlParameter("@OnDate",line[0].OnDate),
                    new SqlParameter("@OnTime",line[0].OnTime),
                    new SqlParameter("@Cash",line[0].Cash),
                    new SqlParameter("@Computer",line[0].Computer),
                    new SqlParameter("@Offdate",line[0].Offdate),
                    new SqlParameter("@Offtime",line[0].Offtime),
                    new SqlParameter("@ConsumeTime",line[0].ConsumeTime),
                    new SqlParameter("@Consume",line[0].Consume),
                    new SqlParameter("@Status",line[0].Status)
            };
            string procname = "proc_OffLine";
            sqlhelper.ExecuteNonQuery(procname, sqlparas, CommandType.StoredProcedure);

            return line;

        }

加上设计模式

有变化的代码只有这一小段,就不再贴一遍代码了

            //-------------------------------------------------------------------

            //这里面的是算钱的代码,全都不要了
            //-------------------------------------------------------------------

            LoginDAL.算钱策略模式.CostOperation costOperater = new 算钱策略模式.CostOperation(stucard[0].Type);

            line = costOperater.ICalculateCost(stucard, line);
            double newCash = oldCash - Convert.ToDouble(line[0].Consume);

            //line[0].Consume = Cost.ToString();
            //line[0].ConsumeTime = CostTime.ToString();
            line[0].Cash = newCash.ToString();
            line[0].Status = "正常下机";

策略模式的应用

    public class CostOperation
    {
        ICostStragety stragety = null;

        public CostOperation(string type)
        {
            switch (type)
            {
                case "一般用户":
                    stragety = new LoginDAL.算钱策略模式.FixedUserStragety();
                    break;
                case "固定用户":
                    stragety = new LoginDAL.算钱策略模式.TempUserStragety();
                    break;
            }
        }
        public IList<CardModel.Lines> ICalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line)
        {

            return stragety.CalculateCost(stucard, line);
        }

接口的实现

    public interface ICostStragety
    {
        IList<CardModel.Lines> CalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line);
    }

子策略

    class FixedUserStragety : ICostStragety
    {
        public IList<CardModel.Lines> CalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line)
        {
            SqlHelper sqlhelper = new SqlHelper();

            string sqlbasicdata = "select * from BasicData_info where serial = (select max(Serial) from BasicData_info)";//找到编号最大(也就是最新的)的记录
            DataTable basicdatadt = sqlhelper.ExecuteQuery(sqlbasicdata, CommandType.Text);
            IList<BasicDataModel.BasicData> bd = LoginDAL.ConvertHelper<BasicDataModel.BasicData>.ConvertToModel(basicdatadt);

            Responsibility.Manager timeManager = new Responsibility.TimeManager();
            Responsibility.Manager moneyManager = new Responsibility.MoneyManager();
            
            //设置责任链上级
            timeManager.SetSuperior(moneyManager);
            timeManager.RequestApplications(line, bd);            

            return line;
        }
    }

责任链模式的应用

namespace LoginDAL.Responsibility
{
    public abstract class Manager
    {
        protected Manager superior;
        public void SetSuperior(Manager superior)
        {
            this.superior = superior;
        }

        public abstract void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd);

    }
    public class TimeManager : Manager
    {
        public override void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd)
        {


            DateTime ondatetime = Convert.ToDateTime(line[0].OnDate.Split(' ')[0] + " " + line[0].OnTime);
            DateTime offdatetime = Convert.ToDateTime(line[0].Offdate + " " + line[0].Offtime);
            double SpendTime = (offdatetime - ondatetime).TotalHours;
            line[0].ConsumeTime = SpendTime.ToString("#0.0");

            superior.RequestApplications(line, bd);


        }
    }
    public class MoneyManager : Manager
    {
        public override void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd)
        {
            //单位增长时间
            double PerTime = Convert.ToDouble(bd[0].UnitTime) / 60;
            //单位时长的钱
            int PerMoney = Convert.ToInt32(bd[0].Rate);
            //准备时间
            double MinTime = Convert.ToDouble(bd[0].PrepareTime) / 60;
            //花费金额
            int Cost = 0;
            double SpendTime = Convert.ToDouble(line[0].ConsumeTime);
            if (SpendTime > MinTime)
            {
                while (SpendTime > 0)
                {
                    SpendTime -= PerTime;
                    Cost += PerMoney;
                }
            }
            line[0].Consume = Cost.ToString();

        }
    }
}

总结

我总觉得我的策略模式是简单工厂和策咯模式的结合,越看越像,不过还是有那么一点点凌乱。

最重要的一点是,自己可以切切实实的体会到,代码的拓展性、可重用性、维护性得到了质的提高。即使我的应用是错误的,这种思想也值得我们每个人去学习、去深思!!

ps:自我感觉注释做的很不到位...

猜你喜欢

转载自blog.csdn.net/qq1515312832/article/details/79365527