てぃぐれのプログラマwiki

ワクワクに従う

Stateパターン 【デザインパターン】

Stateパターン

「状況(State)」に応じて機能を変更するパターン。

状況の中で次の状況に変更してあげるというのがポイント。

 

メリット

状況を持たせることで、メインで条件分岐を多くしなくて良いので、ソースが複雑にならない。

状況が整理されていないと、Stateクラスの中が複雑になりそう。

予め、フローがあると分かりやすいだろう。

 

テンプレートパターンとの違い

プログラムを見ていると、テンプレートパターンとどう違うのだろうと思った。

テンプレートパターン(横へ広がるパターン)

・状況という概念がない。

・型が決まっているところに対して、様々な型を用意できる。

・異なる処理を一つの流れのように用意し、その振る舞いを実装する。

 

Stateパターン(縦に伸びるパターン)

・状況により処理を変える。(様々な流れを作ることができる。)

 

クラス図

f:id:tigretic:20220317152932j:plain

 

コード

全然条件分岐してないが、Stateが振る舞いを決めているのがわかる
 
public interface IState
{
void doAction(Laundry obj);
}

public class Laundry
{
IState state = null;
public void setState(IState obj)
{
state = obj;
}

public void laundry()
{
state = new Wash();
while(state != null)
{
state.doAction(this);
}

Console.WriteLine("終わりました。");
}

}

public class Wash:IState
{
public void doAction(Laundry obj)
{
Console.WriteLine("Washed");
obj.setState(new Rinse());
}
}

public class Rinse:IState
{
public void doAction(Laundry obj)
{
Console.WriteLine("Rinsed");
obj.setState(new Dehydration());
}
}

public class Dehydration:IState
{
public void doAction(Laundry obj)
{
Console.WriteLine("Dehydarated");
obj.setState(null);
}
}

 

参考

【プログラミング講座(C#)】第104回 Stateパターンについて【独り言】 - YouTube