天天看点

【机房重构】-职责连模式

BLL层

namespace BLL
{
    public class ChainBLL
    {
        public void InquiryBasic()
        {
            //调用工厂方法创建接口
            StuOffFactory fact = new StuOffFactory();
            //调用接口
            StuOffIDAL idal = fact.StuOffFact();
            //调用D层查询方法
            Entity.BasicData_Info BasicDataInfo= new BasicData_Info();
            DataTable table = idal.InqBasicData(BasicDataInfo);
            rate = Convert.ToDecimal(table.Rows[0]["UnitCash"].ToString());
        }
        public static decimal rate;
        public static decimal cash;

        public decimal CostCash(int time)
        {
            InquiryBasic();
            ChainMoney c1 = new ConcreChainMoney1();
            ChainMoney c2 = new ConcreChainMoney2();
            ChainMoney c3 = new ConcreChainMoney3();
            c1.SetSuccessor(c2);
            c2.SetSuccessor(c3);
            c1.costcash(time);
            return cash;
        }

        public abstract class ChainMoney
        {
            protected ChainMoney successor;//设置继承者
            public void SetSuccessor(ChainMoney successor)
            {
                this.successor = successor;
            }
            public abstract void costcash(int time);
        }
        //当时间在0-2分钟之内则有权处理,费则转到下一位
        public class ConcreChainMoney1 : ChainMoney
        {
            public override void costcash(int time)
            {
                if (time>=0 && time <2)
                {
                    cash = 0;
                }
                else if (successor != null)
                {
                    successor.costcash(time);//转到下一位
                }
            }
        }

        //但时间在2分钟到1小时之间则有权处理,则转移到下一位
        public class ConcreChainMoney2 : ChainMoney
        {
            public override void costcash(int time)
            {
                if (time >= 2 && time <= 60)
                {
                    cash = rate / 60 * time * Convert.ToDecimal(1.2);
                }
                else if (successor != null)
                {
                    successor.costcash(time);//转到下一位
                }
            }
        }

        //当时间大于1小时则有权处理,否则转一下一位
        public class ConcreChainMoney3 : ChainMoney
        {
            public override void costcash(int time)
            {
                if (time > 60)
                {
                    cash = rate / 60 * time;
                }
                else if (successor != null)
                {
                    successor.costcash(time);//转到下一位
                }
            }
        }
    }
}
           

UI层

//下机:
        DateTime TimeNow = new DateTime();
        TimeSpan TimeCount = new TimeSpan();
        public decimal limitcash;
        public static decimal cash;
        public string studentname;
        public static decimal costcash;
        public DateTime dt;
        public void ButOff_Click(object sender, EventArgs e)
        {

            
            
            Entity.Card_Info CardInfo = new Entity.Card_Info();
            CardInfo.CardNo = TxtCardNo.Text.Trim();
            CardInfo.Balance =Convert.ToInt32(TxtBalancd.Text.Trim());//将字符串类型的变量转换成int类型,并存入数据库中
            Facade.StuOffFacade facadeCard = new Facade.StuOffFacade();
            int intOff = facadeCard.CardInfo(CardInfo);
            Entity.OnOff_Info OnOffInfo = new Entity.OnOff_Info();
            OnOffInfo.CardNo = TxtCardNo.Text.Trim();
            TxtOffDate.Text = DateTime.Now.ToLongTimeString();
            //TxtOnDate.Text =Convert.ToString( OnOffInfo.OnDate);
            OnOffInfo.OffDate = DateTime.Now;
            timer2.Stop();

            Facade.StuOffFacade facadeoff = new Facade.StuOffFacade();

            int intofftime = facadeoff.OnOffInfo(OnOffInfo);

            Entity.Card_Info UpCardInfo = new Entity.Card_Info();
            UpCardInfo.CardNo = TxtCardNo.Text.Trim();
            Facade.StuOnFacade facaCard = new Facade.StuOnFacade();
            UpCardInfo.OnOff = "未上机";
            int Card = facaCard.UpdateCard(UpCardInfo);
            ButOff.Enabled = false;
            ButOn.Enabled = true;

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            TimeCount = DateTime.Now - TimeNow;
            TxtCostTime.Text = string.Format("{0:00}:{1:00}:{2:00}",TimeCount.Hours,TimeCount.Minutes,TimeCount.Seconds);//将消费时间显示为动态计时
            
        }

        /// <summary>
        /// 计算消费金额
        /// </summary>
        public int time;
        public void CostCash()
        {
            Facade.ChainFacade faca = new Facade.ChainFacade();
            time = TimeCount.Minutes;
            costcash = faca.CostCash(time);
            TxtCost.Text = costcash.ToString("0");
        }
        
        

        private void TxtCostTime_TextChanged(object sender, EventArgs e)
        {
            for (int i = 0; i <= TimeCount.Minutes; i++)
            {
                decimal a  = cash - costcash;
                TxtBalancd.Text = a.ToString("0");
                CostCash();
                int b = Convert.ToInt32(TxtBalancd.Text.Trim());
                if (cash <= costcash)
                {
                    MessageBox.Show("余额不足,即将自动下机", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }
            return;
           

其他层都大同小异,在此不再过多介绍,如果有什么错误的地方,还请各位斧正。