版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TheBestAge/article/details/82387949
状态模式 |
状态模式:当一个对象的状态发生改变时,允许改变其行为。当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
具体实现 |
UI层
Entity.Gloable.Time = 1;//在上机操作中赋值,判断其实时查询余额的次数(经过多少个小时)
private void txtcardNo_EnabledChanged(object sender, EventArgs e)
{
if (txtcardNo.Enabled == false)//当确定用户已上机,则启动状态模式,实时判断余额情况
{
//timer3.Enabled = true;//计时器开始运行
timer3.Start();//启动计时器
}
}
private void timer3_Tick(object sender, EventArgs e)
{
//获得该学生的学号
Student_info student = new Student_info();
Line_info line = new Line_info();
student.CardNo = Convert.ToInt32(txtcardNo.Text.Trim());
//查询该用户的余额情况
Facade.MainFacade facade = new Facade.MainFacade();//实例化外观
DataTable table = facade.SelectStudent(student);
//传参
line.Cash =Convert.ToDouble(table.Rows[0][7].ToString());
line.Type = table.Rows[0][13].ToString().Trim();
line.Cardno = student.CardNo;
line.ConsumeTime =Gloable.Time;//获得不断增加的花费时间
//每一个小时查看其余额
string a = facade.InquiryState(line);
if (a == "null")
{
return;//跳出
}
else
{
MessageBox.Show(a, "提示");
if (a== "余额不足5元,正在下机")
{
button1_Click(sender,e);//调用下机事件
timer3.Stop();//终止实时查看余额情况,停止计时器
}
}
BLL层
public string InquiyState(Entity.Line_info line)
{
//获取基本数据
Factory.Factory fact = new Factory.Factory();
IDAL.IBasicDate idal = fact.Opbasicdata();
DataTable table = idal.Selectdata();
//为实体赋值
line.Rate = Convert.ToInt32(table.Rows[0][0]);
line.tmpRate = Convert.ToInt32(table.Rows[0][1]);
#region//策略模式计算花费金额
#endregion
//获取学生表中的剩余金额
Entity.Student_info student = new Student_info();
student.CardNo = line.Cardno;
IDAL.IStudentIDAL idal2 = fact.Selectstudent();
DataTable dt = idal2.Selectstudent(student);
//将花剩余金额传给实体
line.Cash = Convert.ToDouble(dt.Rows[0][7].ToString()) - line.Consume;
//调用状态模式,判断金额状态
StateModel.Context cashstate = new StateModel.Context();
cashstate.Consume = line.Cash;//将剩余金额赋给context的对象属性
string a=cashstate.WriteProgram();
//时间+1
Entity.Gloable.Time++;
return a;
}
State
public abstract class State//抽象状态
{
public abstract string WriteProgram(Context context);//抽象处理请求的方法
}
public class Context//维护一个State的实例,并定义了当前的状态
{
private State current;
public Context()
{
current = new StateOne();//定义一个初始状态
}
private double consume;//定义一个属性
public double Consume
{
get { return consume; }
set { consume = value; }
}
public void SetState(State s)//改变初始状态
{
current = s;
}
public string WriteProgram()//请求的处理
{
string a = current.WriteProgram(this);
return a;
}
}
public class StateOne : State//具体状态
{
public override string WriteProgram(Context context)
{
string a = "null";
if (context.Consume >= 10)
{
a = "null";
}
else
{
context.SetState(new StateTwo()); context.WriteProgram();
}
return a;
}
}
public class StateTwo : State//具体状态
{
public override string WriteProgram(Context context)
{
string a = "null";
if (context.Consume < 10)
{
a = "余额不足10元,请尽快充值,以免影响上机!";
}
else
{
context.SetState(new StateThere()); context.WriteProgram();
}
return a;
}
}
public class StateThere: State//具体状态
{
public override string WriteProgram(Context context)
{
string a = "null";
if (context.Consume < 5)
{
a = "余额不足5元,正在下机";
}
return a;
}
}
总结 |