版权声明:本文为博主原创文章,未经博主允许不得转载。 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秒后自动关机!");
}
}
}
}
每个模式想要深入理解的话,必须动手敲出来这个例子,观察之中的参数是如何传递的,每一步是怎么得来的;