序
事物的发展总是伴随着状态的转换,犹如人会经历婴幼儿到青壮年。四季一年,有春的盎然,夏的炽烈,秋的多彩,冬的洁白。第三篇就从这可爱的四季开始吧。
状态模式的核心:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
优点:封装了转换规则。缺点:状态类之间的耦合性比较强。
实现
上下文管理类
public class Context
{
private State curState;
public void process(int month)
{
this.curState.handle(month, this);
}
public void setState(State newState)
{
this.curState = newState;
}
}
状态接口类
public interface State
{
public void handle(int age, Context ctx);
}
具体实现类
春
public class Spring implements State
{
@Override public void handle(int month, Context ctx)
{
System.out.println("Spring: Green");
if(month >= SeasonDefine.SUMMER_BEGIN_MONTH - 1)
{
System.out.println("Change State: Spring -> Summer, Sweet Flower and SunShine");
ctx.setState(new Summer());
}
}
}
夏
public class Summer implements State{
@Override
public void handle(int month, Context ctx)
{
System.out.println("Summer: Red");
if(month >= SeasonDefine.AUTUMN_BEGIN_MONTH - 1)
{
System.out.println("Change State: Summer -> Autumn, Bright Colors"); ctx.setState(new Autumn());
}
}
}
秋
public class Autumn implements State
{
@Override
public void handle(int month, Context ctx)
{
System.out.println("autumn, yellow");
if(month >= SeasonDefine.WINNER_BEGIN_MONTH - 1)
{
System.out.println("Change State: Autumn -> Winner, magic snow world"); ctx.setState(new Winner());
}
}
}
冬
public class Winner implements State
{
@Override
public void handle(int month, Context ctx)
{
System.out.println("Winner, White");
if(month >= SeasonDefine.WINNER_OVER_MONTH)
{
System.out.println("Change State: Winnder -> Spring, Happy New Year"); ctx.setState(new Spring());
}
}
}
测试
public class StatePatternDemo
{
public static void main(String[] args)
{
Context ctx = new Context();
ctx.setState(new Spring());
for(int month = 1; month <= 12; month++)
{
System.out.println("month : " + month);
ctx.process(month);
}
}
}
附
public class SeasonDefine
{
public static final int SPRING_BEGIN_MONTH = 1;
public static final int SUMMER_BEGIN_MONTH = 4;
public static final int AUTUMN_BEGIN_MONTH = 7;
public static final int WINNER_BEGIN_MONTH = 10;
public static final int WINNER_OVER_MONTH = 12;
}