十五. 状态模式
整理自 《java与模式》阎宏编著
1.意图:
允许一个对象在其内部状态改变时改变它的行为。
2.类图:
[img]http://eneasy.iteye.com/upload/picture/pic/10091/fe28b620-9408-32d9-9990-e2431ba41c5a.jpg[/img]
3.原理:
封装状态相关的行为到状态对象中,每一个状态对象属于抽象状态类的子类。
4.特征:
抽象状态角(State)色:定义一个接口,用以封装语境(Context)对象的一个特定的状态所对应的行为。
具体状态(ConcreteState)角色:一个具体状态类,实现了语境(Context)对象的一个状态所对应的行为。
语境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例,这个具体状态类的实例给出此环境对象的现有状态。
通过使用多态,可以动态地改变语境(Context)对象的属性State的内容,使其从指向一个具体状态类到指向另外一个具体状态类,从而改变语境(Context)对象的行为。
5.说明:
多态原则是状态模式的核心。
6.使用案例:
7.代码:
//抽象状态角(State)色 State.java
public interface State
{
void handle(String sample);
}
//具体状态(ConcreteState)角色 ConcreteStateA.java
public class ConcreteStateA implements State
{
public void handle(String sample)
{
/*put your code for this particular state here*/
}
}
//具体状态(ConcreteState)角色 ConcreteStateB.java
public class ConcreteStateB implements State
{
public void handle(String sample)
{
/*put your code for this particular state here*/
}
}
//语境(Context)角色 Context.java
public class Context
{
private State state;
public void setState(State newState)
{
this.state = newState;
}
public void someOperation()
{
state.handle("a");
}
}
整理自 《java与模式》阎宏编著
1.意图:
允许一个对象在其内部状态改变时改变它的行为。
2.类图:
[img]http://eneasy.iteye.com/upload/picture/pic/10091/fe28b620-9408-32d9-9990-e2431ba41c5a.jpg[/img]
3.原理:
封装状态相关的行为到状态对象中,每一个状态对象属于抽象状态类的子类。
4.特征:
抽象状态角(State)色:定义一个接口,用以封装语境(Context)对象的一个特定的状态所对应的行为。
具体状态(ConcreteState)角色:一个具体状态类,实现了语境(Context)对象的一个状态所对应的行为。
语境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例,这个具体状态类的实例给出此环境对象的现有状态。
通过使用多态,可以动态地改变语境(Context)对象的属性State的内容,使其从指向一个具体状态类到指向另外一个具体状态类,从而改变语境(Context)对象的行为。
5.说明:
多态原则是状态模式的核心。
6.使用案例:
7.代码:
//抽象状态角(State)色 State.java
public interface State
{
void handle(String sample);
}
//具体状态(ConcreteState)角色 ConcreteStateA.java
public class ConcreteStateA implements State
{
public void handle(String sample)
{
/*put your code for this particular state here*/
}
}
//具体状态(ConcreteState)角色 ConcreteStateB.java
public class ConcreteStateB implements State
{
public void handle(String sample)
{
/*put your code for this particular state here*/
}
}
//语境(Context)角色 Context.java
public class Context
{
private State state;
public void setState(State newState)
{
this.state = newState;
}
public void someOperation()
{
state.handle("a");
}
}