ForNext
Only Do What Only You Can Do
State
VBScript
JScript
Perl
PHP
Python
Ruby
PowerShell
Scala
F#
C
C++
C++Builder
VC++
C#
Java
更新日 : 2010.11.23
Strategy と似ているが、呼ばれる側が状態を変化させる
■ MyMain
public class MyMain { public static void main(String args[]) { MyContext context = new MyContext(); context.changeState(MyStateNight.getInstance()); for (int i = 0; i <= 24; i++) { System.out.print(i); System.out.println("時"); // 状態を変更するタイミングは、Context クラスではなく、 // State クラスが決定する context.setClock(i); } } }
■ MyContext
public class MyContext { public MyState state; public MyContext() { state = MyStateDay.getInstance(); } // 状態を変化させる処理は、State クラスから呼ばれる public void changeState(MyState state) { System.out.println(state.toString() + "です"); this.state = state; } public void setClock(int h) { state.setClock(this, h); } }
■ MyState
public interface MyState { public void setClock(MyContext context, int h); public String toString(); }
■ MyStateDay
public class MyStateDay implements MyState { private static MyState state = new MyStateDay(); private MyStateDay () { } public static MyState getInstance() { return state; } public void setClock(MyContext context, int h) { if (h < 6 || 18 <= h) context.changeState(MyStateNight.getInstance()); } public String toString() { return "昼"; } }
■ MyStateNight
public class MyStateNight implements MyState { private static MyState state = new MyStateNight(); private MyStateNight () { } public static MyState getInstance() { return state; } public void setClock(MyContext context, int h) { if (6 <= h && h < 18) context.changeState(MyStateDay.getInstance()); } public String toString() { return "夜"; } }
L:\>java MyMain 夜です 0時 1時 2時 3時 4時 5時 6時 昼です 7時 8時 9時 10時 11時 12時 13時 14時 15時 16時 17時 18時 夜です 19時 20時 21時 22時 23時 24時