C#机房重构-实时查看上机余额(状态模式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
        }

    }

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

猜你喜欢

转载自blog.csdn.net/TheBestAge/article/details/82387949
今日推荐