State模式学习

来源:互联网 发布:优化排名软件价格 编辑:程序博客网 时间:2024/06/05 08:54

刚开始理解strategy不太好理解(因为看书的时候跑神了),statestartegy要容易的多!


State模式用作开关的转换,UML图如上,包含:一个接口Istate,几个实现接口的状态类,一个对外开放的状态调节fireSwitch类(对外使用,赞封装的思维!),一个测试类。

IState接口:

public interfaceIState {

publicvoid switchFire(FireSwitch sw);

}

状态类,这里只写一个,其他的都一样只是new出来的状态不同而已,状态总共有:OffState,SmallState,MediumState,LargeState几个是需要进行互相转换的类:

public classLargeState implements IState{

public voidswitchFire(FireSwitch sw) {

sw.setState(newOffState());

System.out.println("offfire");

}}

对外提供功能、调节状态的类FireSwitch:

public classFireSwitch {

private IState current;//接口类对象,用来进行各个状态的转换;

public FireSwitch(){

current = new OffState();//用关闭状态作为初始化的状态

}

public voidsetState(IState s) {

current = s;//此可用于spring中进行注入,但是好像用处不大,应该对应有个getState,此处略去~

}

public voidswitchFire() {

current.switchFire(this);//进行状态转换,每个状态的转换都写死在各个状态的内部,所以这个只要调用相应状态的switchFire函数就可以进行转换,并且转换到已设定好的状态下!比较死,但是在某种特定情况下还是很好的用,比如手动的微波炉的开火的调节,或者如TCP那样有精准的状态转换的逻辑就很好用,若否,则这个比strategy模式要笨一些,因为其下一状态是写死的,不是向后者一样可以通过用户传参进来进行相应的操作!

}}

测试方法:

@Test//此处因为封装的比较好,所以直接调用fireswitch类即可,而不是需要调用整个IState,及各个状态类;

//所以,若你有接口及其实现类时,要封装一个这样对外使用的类,用起来才会比较舒服!

public voidtestFireSwitch() {

FireSwitchfireSwitch = new FireSwitch();

fireSwitch.switchFire();

fireSwitch.switchFire();

fireSwitch.switchFire();

fireSwitch.switchFire();

}

FireSwitch中的switchFire()调用IState中的switchfire()这种封装有种servicedao层的样子!前、后、中间可以添加其他操作,或者权限的控制,而且对外提供一个整齐的接口:switchfire().很完美!!这种思维一定尽快培养起来!!

原创粉丝点击