每天一个(设计模式)--状态(State)模式

UML中有个图叫状态图,描述了对象的状态。
一般来说,对于有状态的对象,在处理动作时,会根据不同的状态得到不同的行为结果。
比如说,一扇旋转门,我们推,如果是关闭的,那么他就打开,如果我们再推,他就关闭。

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]

这就是一个简单的状态机了。点击遥控器的行为,在不同状态,有不同的功能作用。

状态模式运用在一些具有状态的对象上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值