狀態模式(State)

小說:榆樹種子產地在哪里?作者:北建更新時間:2019-05-25字數:66958

狀態模式(State)


【序言】:由于直接貼代碼相關的關鍵字不能智能提示,代碼看著很是不方便。

現在就在概念中用貼圖片進行演示,在實戰案例中還是以貼代碼的形式出現。

一、概念:

  當一個對象的內在狀態改變時,允許改變其行為,這個對象看起來像是改變了其類?!綝P】

?

二、作用:

  狀態模式的主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。

吧狀態的判斷邏輯轉移到表示不同狀態的一系列當中,可以把復雜的判斷邏輯簡化。

當然如果這個狀態的判斷很簡單,那么就沒必要用“狀態模式”了,千萬注意不要為了設計模式而去用設計模式。

?

三、通俗的概念理解:

  就是為了消除龐大的條件分支語句。當一個對象的行為取決于他的狀態,并且他必須在運行時刻根據狀態改變他的行為時,就可以考慮使用狀態模式了。

?

四、狀態模式類圖;

?

五、對概念的理解和針對類圖進行代碼的翻譯;

?

?結果顯示;

?

六、接下啦就是對概念進行實例的操作了,概念記得再熟,也不如實戰一把,

那我這里就是以程序員的加班來進行案例的解釋了,對一天的工作時間與下班來進行一個狀態的切換。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test_02
{

??? //抽象的狀態
??? public abstract class State
??? {
??????? public abstract void WriteProgram(Work work);
??? }

??? //上午的工作狀態
??? public class ForenoonState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? if (work.Hour < 12)
??????????? {
??????????????? Console.WriteLine("當前時間:" + work.Hour + "點,上午工作,精神還行");
??????????? }
??????????? else? //否則,超過12點進行狀態的切換
??????????? {
??????????????? work.SetState(new NoonState());
??????????????? work.WriteProgram();
??????????? }
??????? }
??? }

??? //中午的工作狀態
??? public class NoonState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? if (work.Hour < 13)
??????????? {
??????????????? Console.WriteLine("當前時間:" + work.Hour + "點,中午,餓了,犯困");
??????????? }
??????????? else //轉到下午的工作狀態
??????????? {
??????????????? work.SetState(new AfternoonState());
??????????????? work.WriteProgram();
??????????? }


??????? }
??? }

??? public class AfternoonState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? if (work.Hour < 17)
??????????? {
??????????????? Console.WriteLine("當前時間:" + work.Hour + "點,下午狀態還不錯,繼續努力");
??????????? }
??????????? else//否則,轉為傍晚的工作狀態
??????????? {
??????????????? work.SetState(new EveningState());
??????????????? work.WriteProgram();
??????????? }

??????? }
??? }
??? //晚間工作狀態
??? public class EveningState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? if (work.Finish == true)????? //當工作完成了,則轉入下班的裝態
??????????? {
??????????????? work.SetState(new RestState());
??????????????? work.WriteProgram();
??????????? }
??????????? else
??????????? {
??????????????? if (work.Hour < 21)
??????????????? {
??????????????????? Console.WriteLine("當前時間:" + work.Hour + "點,加班哦,疲累至極");
??????????????? }
??????????????? else??????????????? //當時間超過21點則轉入睡覺的狀態
??????????????? {
??????????????????? work.SetState(new SleepState());
??????????????????? work.WriteProgram();
??????????????? }
??????????? }
??????? }
??? }
??? //睡眠狀態
??? public class SleepState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? Console.WriteLine("當前時間:" + work.Hour + "點,已經撐不住了,睡著了");
??????? }
??? }

??? //下班休息狀態
??? public class RestState : State
??? {
??????? public override void WriteProgram(Work work)
??????? {
??????????? Console.WriteLine("當前時間:" + work.Hour + "點,下吧回家休息了");
??????? }
??? }

??? //工作類
??? public class Work
??? {
??????? private State current;
??????? public Work()
??????? {
??????????? current = new ForenoonState();//工作的初始狀態為上午工作狀太,9點開始工作
??????? }
??????? private double hour;??? //屬性,狀態切換的依據

??????? public double Hour
??????? {
??????????? get { return hour; }
??????????? set
??????????? {
??????????????? hour = value;
??????????? }
??????? }

??????? private bool finish = false;??????? //任務完成標志,是否能下班的標志

??????? public bool Finish
??????? {
??????????? get { return finish; }
??????????? set { finish = value; }
??????? }

??????? public void SetState(State state)
??????? {
??????????? current = state;
??????? }

??????? public void WriteProgram()
??????? {
??????????? current.WriteProgram(this);
??????? }

??? }
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? Work work = new Work();
??????????? work.Hour = 19;
??????????? work.WriteProgram();
??????????? Console.ReadKey();
??????? }
??? }
}
七、總結:

  當一個對象的行為取決于他的狀態,并且他必須在運行時刻根據狀態改變他的行為時,就可以考慮使用狀態模式了,

例如可以在角色的AI切換的時候使用,在游戲界面的登錄界面以及其他界面的切換中使用,

八:擴充:

  在寫代碼的時候,一定要避免在一個類中的方法過于太長了的情況發生,看起來也是不太爽的是吧!

?

?

????????????????????????                                                                                           2017-12-14 00:27:06

當前文章:http://www.hfcxdn.com/news2018112386807/

發布時間:2019-05-25 17:24:28

繡球花產地在哪里? 哪里有供應紅王子錦帶的基地? 廣東可以栽植毛鵑嗎? 竹柳苗價格哪家最低? 公園里可以種植玉簪嗎? 河邊能不能種植馬蘭花? 衛矛子播方法簡單嗎? 3公分花石榴批發價格多少錢? 美人蕉可以種水邊嗎? 什么是大麥?

櫻花基地大量處理櫻花種苗,無病蟲害優質壯苗! 紅瑞木每平方米栽多少棵? 哪里有賣紅花酢漿草種子的? 虞美人種子幾月成熟? 波斯菊十月播種晚不晚?  天堂草冬天綠嗎? 冬天可以種植糖蜜草嗎? 金盞菊籽什么價格能買到? 哪里有園林雞冠花種子? 江蘇哪里有賣海棠種子的? 皂角陳種子能種出嗎?

編輯:宗卓通

我要說兩句: (0人參與)

發布
捕鱼达人之深海狩猎