刚开始理解strategy不太好理解(因为看书的时候跑神了),但state比startegy要容易的多!
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()这种封装有种service与dao层的样子!前、后、中间可以添加其他操作,或者权限的控制,而且对外提供一个整齐的接口:switchfire().很完美!!这种思维一定尽快培养起来!!