動機:允許一個對象在其內部狀態改變時改變它的行為。從而使對象看起來似乎修改了其行為。
情境:檔案具有唯讀、讀寫狀態,在不同狀態時進行的操作不同。
結構
代碼
namespace DesignPattern.State
{
public class File
{
private FileState state;
public File(FileState state)
{
this.state = state;
}
public FileState State
{
get
{
return state;
}
set
{
state = value;
}
}
public void Process1()
{
state.Process1();
}
public void Process2()
{
state.Process2();
}
public void Process3()
{
state.Process3();
}
}
}
namespace DesignPattern.State
{
public abstract class FileState
{
public abstract void Process1();
public abstract void Process2();
public abstract void Process3();
}
public class ReadOnlyState : FileState
{
public override void Process1()
{
}
public override void Process2()
{
}
public override void Process3()
{
}
}
public class ReadWriteState : FileState
{
public override void Process1()
{
}
public override void Process2()
{
}
public override void Process3()
{
}
}
}
要點:
1、本模式將所有與一個特定狀態相關的行為都放入一個State的子類對象中,在對象狀態切換時,切換相應的對象;但同時維護State的介面,這樣實現了具體操作與狀態轉換之間的解耦。
2、為不同的狀態引入不同的對象使得狀態轉換變得更加明確,而且可以保證不會出現狀態不一致的情況,因為轉換是原子性的——要麼徹底轉換,要麼不轉換。
3、如果State對象沒有執行個體變數,那麼各個上下文可以共用同一個State對象,從而節省對象開支。