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#機房重構-如何一鍵清空C#
- C#機房重構之註冊窗體C#
- 機房重構總結
- C#狀態機StatelessC#
- FSM狀態機及C#反射實現邏輯C#反射
- C#設計模式之狀態模式C#設計模式
- 機房上機總結
- RStack上開通檢視免費KVM VPS如何檢視虛擬機器實時流量虛擬機
- 淺談TCP(1):狀態機與重傳機制TCP
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- 狀態機
- GitLab 的元件狀態檢視Gitlab元件
- 檢視BW執行狀態
- 怎麼檢視印表機ip地址 如何在印表機上檢視ip地址
- 大中臺模式下如何構建複雜業務核心狀態機元件模式元件
- win10 如何檢視開機時長_win10檢視開機時長教程Win10
- 有限狀態機
- Macbook如何檢視開機時間?Mac
- 機房重構七層登陸之錯誤集錦
- 使用C# (.NET Core) 實現狀態設計模式 (State Pattern)C#設計模式
- 狀態機模式 與 ajax 的結合運用模式
- 如何檢視電腦的上一次開機時間
- Kylin系統檢視firewalld狀態
- firewalld:檢視版本/幫助/狀態
- 前端狀態管理與有限狀態機前端
- C# 同步 非同步 回撥 狀態機 async await DemoC#非同步AI
- Centos7.2 上防火牆的狀態檢視和關閉CentOS防火牆
- 機房IT運維工作者如何在工作之餘提升自身實力?運維
- 在GI安裝完成後檢視叢集狀態時發現,磁碟組狀態不對
- 狀態機設計
- 【手機在網狀態查詢】實時更新,準確率99.99%
- 如何檢視CATIA許可證狀態
- 檢視一個通訊埠狀態
- 使用 telescope 檢視 schedule 執行狀態
- 系統狀態統計和檢視
- 平穩突破單機房容量瓶頸,B站離線多機房架構實踐架構
- 11.23實驗 22:狀態模式模式