設計模式 - 狀態模式

一、概述

  • 狀態模式,當一個對象的內在狀態改變的時候允許改變其行為,這個對象看起來像是改變了其類。
  • 狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時候的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的判斷邏輯簡單化。
  • 狀態模式的好處
    將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。將特定的狀態行為都放入一個對象中,由于所有與狀態相關的代碼都存在于某個ConcreateState中,所以通過定義新的子類可以很容易的增加新的狀態和轉換。這樣做的母的是為了消除龐大的條件分支語句。狀態模式通過把各種狀態轉移邏輯分布到 State 的子類之間,來減少相互間的依賴。

二、舉例

  • 需求:
    根據工作事件來返回工作的狀態。
//工作狀態基類
class State
{
    public abstract void WriteProgram(Work w);
}
//上午工作狀態類
public class ForennoonState :State
{
    public overridevoid WriteProgram (Work w)
    {
        if (w.Hour < 12)
        {
            Console.WriteProgram("當前時間:{0} 上午工作",w.Hour);
        }   
        else
        {
            w.SetState(new NoonState());
            w.WriteProgram();   
        }
    }
}
//下午工作狀態類
public class  AfternoonState:State
{
    public override void WriteProgram (Work w)
    {
        if (w.TaskFinished)
        {
            w.SetState(new RestState());
            w.WriteProgram();
        }
        else
        {
            if (w.Hour < 21)
            {
            Console.WriteProgram("當前時間:{0} 午休",w.Hour);
            }else
            {
                w.SetState(new SleepingState());
                w.WriteProgram();
            }
        }
    }
}
//工作類
public class Work
{
    private State state;
    public Work()
    {
        current = new ForennoonState();
    }
    private double hour;
    public double Hour
    {
        get{return hour;}
        set{hour = value;}
    }
    private bool finish = false;
    public bool TaskFinished
    {
        get{return finish;}
        set{finish = value;}
    }
    public void setState(State s)
    {
        current = s;
    }
    public void WriteProgram()
    {
        current.WriteProgram(this);
    }
}
//客戶端調用
static void Main(string[] args)
{
    Work m = new Work();
    m.Hour = 9;
    m.WriteProgram();
    m.Hour = 10;
    m.WriteProgram();
    m.Hour = 12;
    m.WriteProgram();
    m.Hour = 15;
    m.WriteProgram();
    m.Hour = 17;
    m.WriteProgram();
    m.TaskFinished = false;
    Console.Read();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、概念 封裝狀態的轉變過程 1.1、定義 允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它的類。...
    雙魚子曰1987閱讀 331評論 0 0
  • STATE(狀態) ———— 對象行為型模式 意圖 允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改...
    tomas家的小撥浪鼓閱讀 497評論 0 0
  • 原文地址:LoveDev 一個對象的行為其屬性的動態變化,這樣的屬性叫狀態,這類對象也叫做有狀態的對象。當此類對象...
    KevinLive閱讀 205評論 0 0
  • 今天我們來學習一種行為型模式,狀態模式(State Pattern)。 模式定義 允許一個對象在其內部狀態改變時改...
    HJXANDHMR閱讀 4,519評論 5 12
  • 在那金水河畔順河路邊有一群藍精靈 他們開會又執勤 他們出差又熬夜 他們勤勤懇懇生活在那霧霾的大鄭州 他們善良勇敢相...
    亓盼閱讀 372評論 0 0