1. 概述
當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。
2. 解決的問題
主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到程式設計客棧表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。
3. 模式中的角色
3.1 上下文環境(context):它定義了客戶程式需要的介面並維護乙個具體狀態角色的例項,將與狀態相關的操作委託給當前的concrete state物件來處理。
3.2 抽象狀態(state):定義乙個介面以封裝使用上下文環境的的乙個特定狀態相關的行為。
3.3 具體狀態(concrete state):實現抽象狀態定義的介面。
4. 模式解讀
4.1 狀態模式的類圖
4.2 狀態模式的**實現
///
/// context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態。
///
public class context
///
/// 可讀寫的狀態屬性,用於讀取和設定新狀態
///
public state state
set
} ///
/// 對請求做處理,並設定下乙個狀態
///
public void request()
}///
/// 抽象狀態類,定義乙個介面以封裝與context的乙個特定狀態相關的行為
///
public abstract class state
///
/// 具體狀態類,每乙個子類實現乙個與context的乙個狀態相關的行為
///
public class concretestatea : state }
public class concretestateb : state
}4.3 客戶端呼叫
class program
}執行結果
5. 模式總結
5.1 優點
5.1.1 狀態模式將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。
5.1.2 所有狀態相關的**都存在於某個conceretestate中,所以通過定義新的子類很容易地增加新的狀態和轉換。
5.1.3 狀態模式通過把各種狀態轉移邏輯分不到state的子類之間,來減少相互間的依賴。
5.2 缺點
5.2.1 導致較多的concretestate子類
5.3 適用場景
5.3.1 當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式來。
5.3.2 乙個操作中含有龐大的分支結構,並且這些分支決定於物件的狀態。
6. 應用舉例:電燈有兩個狀態,開(亮)與關(不亮),下面就用狀態模式來實現對電燈的控制。
6.1 類圖
6.2 實現**
///
/// 電燈類,對應模式中的context類
///
public class light
///
/// 按下電燈開關
///
public void pressswich()
public lightstate state
set
} } ///
/// 抽象的電燈狀態類,相當於state類
///
public abstract class lightstate
///
/// 具體狀態類, 開
///
public class on : lightstate }
///
/// 具體狀態類,關
///
public class off: lightstate
}6.3 客戶端**
class program
}執行結果
本文標題: c# 設計模式系列教程-狀態模式
本文位址:
設計模式系列之 狀態模式
這種型別的設計模式屬於行為型模式,它他解決了方法的合理呼叫 狀態模式用於乙個事件或物件有很多狀態,狀態之間會互相轉換,對不同狀態有不同的行為的情況 狀態模式將不同的情況封裝為乙個類 這樣避免了if else的多次呼叫 而且增加新的情況不改變原有 這樣可以通過只一次判斷狀態就可以完成相應方法的呼叫 需...
C 設計模式系列教程 單例模式
1.描述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。2.單例模式主要有3個特點,2.1 單例類確保自己只有乙個例項。2.2 單例類必須自己建立自己的例項。2.3 單例類必須為其他物件提供唯一的例項。3.實現方式 懶漢單例類和餓漢單例類 3.1 懶漢式單例類 對於懶漢模式,我們可以這樣理...
C 設計模式系列教程 簡單工廠模式
1.概述 將乙個具體類的例項化交給乙個靜態工廠方法來執行,它不屬於gof的23種設計模式,但現實中卻經常會用到 2.模式中的角色 2.1 工廠類 factory 只包含了建立具體類的靜態方法。2.2 抽象產品 product 定義簡單工廠中要返回的產品。2.3 具體產品 concreteproduc...