1. 程式人生 > >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]);
        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;
        }

    }
總結
對於實時檢視使用者金額情況,我採用的是狀態模式,可能不是很精簡。對於這種功能的實現也推薦使用觀察者模式。觀察者模式可能會更好的在狀態發生變化時,通知所有觀察者物件,能夠 自動更新自己。這點還是很棒的!

相關推薦

C#機房重構-實時檢視上機餘額狀態模式

狀態模式 狀態模式:當一個物件的狀態發生改變時,允許改變其行為。當控制一個物件狀態轉換的條件表示式過於複雜時,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。 具體實現 UI層 Entity.Gloable.Time =

機房-學生檢視上機記錄功能實現

出現的問題: 1.下機時間為null 不顯示本行資料 2.生成excel表格 3.將生成excel表格的程式碼新增到模組中,在窗體模組中進行呼叫時myFlexgrid出現未定義 解決方法: 1.使用了isnull()函式 程式碼如下: If IsNull(mrc.Fields(8)

機房重構】——檢視上機記錄、充值記錄+三層+儲存過程+模板方法

模板方法 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 即:重複度高的窗體,可以用模板方法,比如組合查詢。少數

使用C++/libCurl/Jsoncpp讀取arcgis wmts 服務restful模式

col IT 最終 rip .... exists req ade hat 前言:   最近工作需要將arcgis的wmts服務接入我們的3DGis系統平臺,要求用戶只輸入一個rest模式的wmts服務地址,系統即可自動獲取並解析其元數據信息,生成wmts圖層,並渲染顯示

23種設計模式 之 State模式狀態模式 C語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C#機房重構-總結

一,迴圈方法 1.for迴圈 這個是我舉得例子,這個是迴圈輸出在datagridview中選中的一行元組, int rowindex = dataGridView1.NewRowIndex; for (int j = 0; j < dataGridView1.C

機房收費系統之學生檢視上機記錄MSHFlexGrid控制元件資料匯出Excel

       這個窗體之所以可以順利的進行下去,全靠藉助於巨人的力量,站在了巨人的肩膀上前行,Excel的匯出還是很神奇的,讓我們一起來看一下吧^_^ 一、學生檢視上下機記錄窗體的流程圖 二、查詢集 ①、機房收費系統中Excel表如何匯出 ②、vb中DoEve

C#機房重構之錯誤集錦

錯誤越多,收穫越大,感覺這次收穫滿滿啊! 內容 1.必須宣告標量變數 一種可能就是你的U層沒有給變數賦值,這次我遇到的就是這種錯誤。 2.為將物件引用設定到物件的例項 解決辦法

C#機房重構-下機策略模式

策略模式 策略模式:定義演算法家族,分別封裝,讓它們之間可以相互替換,此模式計演算法的變化,不會影響到使用演算法的客戶。策略模式封裝了變化,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就

C#機房重構——註冊增與查

   今天給大家介紹一下關於C#機房重構中的註冊功能,以機房的註冊功能為例,我們重點講解資料表中的增與查,馬上進入我們的主題。 一、查(select語句) 我們知道註冊的時候,首先要查詢我們是否有學號,防止註冊重複的學號,當然我們可以有兩種思路。 第一種,使用者無需提供

C# 機房重構——修改密碼查詢傳值—更新

  經過一天的戰鬥,終於解決了密碼修改的問題,主要就是卡在了傳值的問題上,當你看到這篇部落格的時候,你會深有同感,現在就讓我給大家來說一說如何來修改密碼。    密碼修改只要分為兩大功能,一是判斷自己原來的密碼是否輸入正確,二是將自己的新密碼寫到庫裡面,這兩個功能需要根據使

C#機房重構——組合查詢字典的使用

    首先在這裡宣告,最近一段時間我將持續分享演算法的學習、設計模式、自考、以及機房中的收穫。希望大家持續關注我的部落格,今天分享一下機房重構中組合查詢的學習,當然組合查詢也是狗狗雷教會我的,在這裡首先感謝一下我家狗雷子,當你看完這篇部落格的時候,你會發現組合查詢也可以這樣

C#機房重構】之儲存過程實戰

        在上一篇的文章中,講述了一下儲存過程是什麼,今天這篇文章主要就是自己在實戰過程中遇到的問題和解決方法以及是怎麼進行實戰的。         首先上一個連結:儲存過程,讓小夥伴們先了解一下什麼是儲存

C#機房重構之報表

- 前言 VB版機房就已經做過一次報表了,VS的報表和VB略有不同,一起來看看吧。 -步驟 一、建立窗體 1.建立窗體之後把下面的報表空間新增到窗體上 2.介面如下 二、建立報表 1.新增窗體(此處注意,報表為繁體字,搜尋是搜不出來的) 2. 建立之後

C#機房重構-優化

一、基本限制 //限制只能輸入漢字,正則表示式 if(!Regex.IsMatch(this.txtdepartment.Text.Trim(),"[\u4e00-\u9fa5]")&&

C#機房重構之上下機

上機 上機的難點在於對流程的劃分是否細緻,以及程式碼順序是否安排合理。這裡附上一張上機流程圖。       下機 下機的難點在金額計算以及靈活運用表的增刪改查。 關於運算,小編沒有設定準備時間,一是因為這

C#機房重構之常用限定條件彙總

限制只能輸入數字 //限制只能輸入數字------------------------------------------------------ private void txtUserID_KeyPress(object sender, Ke

C#機房重構之D層sql語句大彙總

前言 重構的過程中個人用到了很多sql語句進行增刪改查,但窗體敲了幾個後發現自己還是寫不出了,那麼就很有必要好好總結總結這些gay裡gay氣的東西了~   正文 select(查詢) //從cancelInfo這個表裡查詢bill屬性=?的某條記錄 string s

C#機房重構之單例模式應用

前言 好久沒好好寫部落格了,掐指一算,2個多月了。今天給大家帶來一篇實用的單例模式實現攻略。   正文 單例模式的目的 我們的機房重構總是有一個主窗體,在主窗體中開啟其他窗體時,其實只要你願意是可以不斷開啟100個的。但如果這樣,既影響使用者體驗,又無實際意義。這時

機房——一般使用者——檢視上機記錄

此窗體主要有兩個功能,一是檢視學生的上機記錄,二是將上機記錄匯出為Excel表 敲窗體之前要先做流程圖,流程圖是機房學習必不可少的步驟 查詢功能部分程式碼展示 If txtCardNo.Text = "" Then MsgBox "請輸入卡號!", vbOKOnly