C#机房重构

阅读: 评论:0

C#机房重构

C#机房重构

状态模式


状态模式:当一个对象的状态发生改变时,允许改变其行为。当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

具体实现

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]);pRate = 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();//时间+1Entity.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;}}

总结
对于实时查看用户金额情况,我采用的是状态模式,可能不是很精简。对于这种功能的实现也推荐使用观察者模式。观察者模式可能会更好的在状态发生变化时,通知所有观察者对象,能够 自动更新自己 。这点还是很棒的!

本文发布于:2024-02-01 04:35:28,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170673332633896.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:机房   重构
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23