机房合作之状态模式在下机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xsh096011/article/details/81951118

状态模式实现下机的思路,通过Cash(余额)的变化来反映不同状态;
Cash<5块钱时,提示充值;
Cash=0时,提示30秒后关机;

需要实时更新UI层的Cash(余额)通过时间的变化从而引起Cash的变化;
cash = cash - CostTime / 60 * 3;

private void timer1_Tick(object sender, EventArgs e)
{
Facade.UserFacade userFacade = new Facade.UserFacade();
List<UserInfo> list = userFacade.InqueryUserInfo(cz_cardno);
string Cash = list[0].Cash.ToString().Trim();
decimal cash = Convert.ToDecimal(Cash);
string consumeTime = userFacade.InqueryCostTime(cz_cardno);
decimal CostTime = Convert.ToDecimal(consumeTime);
lblConsumeTime.Text = string.Format("{0:F2}", consumeTime);   //实时消费金额
//string lblCash = list[0].Cash.ToString().Trim();
cash = cash - CostTime / 60 * 3;
lblCash.Text = Convert.ToString(Cash);
Application.DoEvents();
lblCash.Refresh();
}

这里写图片描述
这里写图片描述

代码如下:

B层

//状态模式下机
UserInfo user = new UserInfo();
user.CardNo = cardNo;
user.IsState = "正在使用";
Context c = new Context(new ConcreteStateA());
c.SetState(user);
c.SetState(user);

Context

namespace StateModel_OffLine
{
    public class Context
    {
        private State state;
        public Context(State state)
        {
            this.state = state;
        }

        public State State
        {
            get { return state; }
            set { state = value; }
        }

        public void SetState(UserInfo user)
        {
            state.OffLine(this, user);
        }
    }
}

State

namespace StateModel_OffLine
{
    public abstract class State
    {
        public abstract void OffLine(Context context,UserInfo user);
    }
}

ConcreteStateA

namespace StateModel_OffLine
{
    public class ConcreteStateA : State
    {
        public override void OffLine(Context context,UserInfo user)
        {
            try
            {
                SqlServerFactory factory = new SqlServerFactory();
                UserIDAL dal = factory.CreateUser();
                UserInfo userInfo = new UserInfo();
                List<UserInfo> userList = dal.InquiryUser(user.CardNo, user.IsState);
                if (userList[0].Cash < 5)
                {
                    throw new Exception("您的余额已不足5元,请充值!");
                }
                else
                {
                    context.State = new ConcreteStateB();
                }
            }
            catch (System.Exception)
            {
                throw new Exception("您的余额已不足5元,请充值!");
            }
        }
    }
}

ConcreteStateB

namespace StateModel_OffLine
{
    public class ConcreteStateB : State 
    {
        private SqlServerFactory factory = null;
        private UserIDAL userDal = null;
        public override void OffLine(Context context,UserInfo user)
        {
            try
            {
                SqlServerFactory factory = new SqlServerFactory();
                UserIDAL dal = factory.CreateUser();
                UserInfo userInfo = new UserInfo();
                List<UserInfo> userList = dal.InquiryUser(user.CardNo, user.IsState);
                if (userList[0].Cash == 0)
                {
                    throw new Exception("您的电脑将在30秒后自动关机!");
                }

            }
            catch (System.Exception)
            {
                throw new Exception("您的电脑将在30秒后自动关机!");
            }
        }
    }
}

每个模式想要深入理解的话,必须动手敲出来这个例子,观察之中的参数是如何传递的,每一步是怎么得来的;

猜你喜欢

转载自blog.csdn.net/xsh096011/article/details/81951118