定義:狀態模式(State Pattern),允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
類型:對象行為型模式
概述:
????????一個對象有一個狀態,那么每一個狀態又對應一些相應的行為。如果這個對象有很多狀態,那么就要對應非常多的行為。那么對這些狀態的判斷以及根據狀態完成相應的行為,會非常復雜。并且如果想添加一種新的狀態時,需要修改很多的現有代碼。這也是有違開閉原則的。狀態模式正是在這樣一種情況下提出來的。
???????狀態模式將每種狀態對應的行為抽象出來成為單獨的新的對象,這樣將狀態轉換顯式化了。狀態的變換不再依賴于Context內部的行為了。另外,將狀態及行為提出來能夠大為降低Context對象的復雜度。另外如果一個State對應多個Context時,State還可以被多個Context對象共享。
???????狀態,我們立馬會提出,今天狀態不好,做什么都沒勁;又或者是今天狀態很好,做事得勁,飯也吃得多。那么我們就以一個人不同時刻的狀態為例來講解狀態模式。
類圖:

參與者:
1. Human,也即Context通過抽象接口來調用狀態對象的具體實現。
1. State,封裝了與Human相關行為的接口。
1. Happy,Sad,具體實現了與相應狀態下的行為。
示例代碼:
~~~
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern21
{
//抽象狀態
public abstract class State
{
public abstract void Eat();
public abstract void Walk();
}
// 高興時的狀態
public class Happy : State
{
public override void Eat()
{
human.Eat();
Console.WriteLine("很多!");
}
public override void Walk()
{
human.Walk();
Console.WriteLine("手舞足蹈的!");
}
public void Attach(Human _human)
{
human = _human;
}
private Human human;
}
// 傷心時的狀態
public class Sad : State
{
public override void Eat()
{
human.Eat();
Console.WriteLine("很少!");
}
public override void Walk()
{
human.Walk();
Console.WriteLine("無精打采的!");
}
public void Attach(Human _human)
{
human = _human;
}
private Human human;
}
// 一個人
public class Human
{
private State current;
public void SetState(State s)
{
current = s;
}
public void Eat()
{
Console.Write("吃了");
}
public void Walk()
{
Console.Write("走起路來");
}
public void Show()
{
current.Eat();
current.Walk();
}
}
class Program
{
static void Main(string[] args)
{
// 定義一個有很多狀態的對象
Human human = new Human();
// 定義一個高興的狀態
Happy hState = new Happy();
hState.Attach(human);
human.SetState(hState);
human.Show();
// 定義一個傷心的狀態
Sad sad = new Sad();
sad.Attach(human);
human.SetState(sad);
human.Show();
// 還可以添加生病的狀態,只需要添加新的類而不需要修改Human類
// ......
Console.Read();
}
}
}
~~~
適用性:
1. 一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為。
1. 一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。
優缺點:
1. 優點,將狀態判斷的邏輯移到類外面,方便通過添加新類來添加新的狀態。
1. 缺點,如果狀態非常多,會導致有非常多的狀態類,加大開銷。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結