UML中有个图叫状态图,描述了对象的状态。
一般来说,对于有状态的对象,在处理动作时,会根据不同的状态得到不同的行为结果。
比如说,一扇旋转门,我们推,如果是关闭的,那么他就打开,如果我们再推,他就关闭。
State设计模式,通过把状态封装,通过接口隔离,使得我们不需要用if else等语句硬编码。缺点是如果状态过多,那么将会有很多的状态类。
状态模式的UML如下图所示:
[img]http://dl.iteye.com/upload/attachment/0065/1249/d0a24a8c-fe76-352f-bde7-b607a759344b.jpg[/img]
下面通过一个开关程序来说明状态模式。
这个开光类似遥控器上的开机,关机,当机器是开的状态时,他执行关闭,当机器是关闭的状态时,他执行打开动作。
电视类(一个可以拥有状态的类,可以实现一个 Stateable接口,不过这样在这里设计过度了)
遥控器,这其实是个调用者类。这里不停的按开关按钮。
下面是关键的状态接口。接口中的Television其实最好为一个接口,Stateable接口。
下面是具体的状态。对于Off状态的电视,改变后就是开(On)。
对于On状态的电视,改变后就是关(Off)
来看下运行结果:
[b]
Televison On!
Televison Close!
Televison On!
Televison Close!
[/b]
这就是一个简单的状态机了。点击遥控器的行为,在不同状态,有不同的功能作用。
状态模式运用在一些具有状态的对象上。
一般来说,对于有状态的对象,在处理动作时,会根据不同的状态得到不同的行为结果。
比如说,一扇旋转门,我们推,如果是关闭的,那么他就打开,如果我们再推,他就关闭。
State设计模式,通过把状态封装,通过接口隔离,使得我们不需要用if else等语句硬编码。缺点是如果状态过多,那么将会有很多的状态类。
状态模式的UML如下图所示:
[img]http://dl.iteye.com/upload/attachment/0065/1249/d0a24a8c-fe76-352f-bde7-b607a759344b.jpg[/img]
下面通过一个开关程序来说明状态模式。
这个开光类似遥控器上的开机,关机,当机器是开的状态时,他执行关闭,当机器是关闭的状态时,他执行打开动作。
电视类(一个可以拥有状态的类,可以实现一个 Stateable接口,不过这样在这里设计过度了)
public class Television {
TelState state;
public Television(){
state = new TelCloseState();
}
public void setState(TelState state){
this.state = state;
}
public TelState getState(){
return this.state;
}
遥控器,这其实是个调用者类。这里不停的按开关按钮。
public class Controller {
Television television;
public Controller(){
television = new Television();
}
public void clickButton(){
television.getState().change(television);
}
public static void main(String[] arg){
Controller controller = new Controller();
controller.clickButton();
controller.clickButton();
controller.clickButton();
controller.clickButton();
}
}
下面是关键的状态接口。接口中的Television其实最好为一个接口,Stateable接口。
public interface TelState {
public void change(Television tel);
}
下面是具体的状态。对于Off状态的电视,改变后就是开(On)。
public class TelOffState implements TelState {
@Override
public void change(Television tel) {
// TODO Auto-generated method stub
System.out.println("Televison On!");
tel.setState(new TelOnState());
}
}
对于On状态的电视,改变后就是关(Off)
public class TelOnState implements TelState {
@Override
public void change(Television tel) {
// TODO Auto-generated method stub
System.out.println("Televison Close!");
tel.setState(new TelCloseState());
}
}
来看下运行结果:
[b]
Televison On!
Televison Close!
Televison On!
Televison Close!
[/b]
这就是一个简单的状态机了。点击遥控器的行为,在不同状态,有不同的功能作用。
状态模式运用在一些具有状态的对象上。