状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是的当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
好处:消除庞大的条件分支语句,将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if…else 等条件选择语句。
实例UML图:
实例代码:
/**
* @author Shuyu.Wang
* @package:com.shuyu.state
* @description:state类接口,定义一个接口以封装与Context的一个特定状态相关的行为
* @date 2018-11-25 21:23
**/
public interface State {
void doAction(Context context);
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.state
* @description:维护一个子类的实例,这个实例定义当前的状态
* @date 2018-11-25 21:24
**/
public class Context {
private State state;
public Context(){
state=null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.state
* @description:实现类接口
* @date 2018-11-25 21:38
**/
@Slf4j
public class StartState implements State {
@Override
public void doAction(Context context) {
log.info("开始状态");
context.setState(this);
}
@Override
public String toString() {
return "Start State";
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.state
* @description:
* @date 2018-11-25 21:54
**/
@Slf4j
public class StopState implements State {
@Override
public void doAction(Context context) {
log.info("结束状态");
context.setState(this);
}
@Override
public String toString() {
return "Stop State";
}
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class StateApplicationTests {
@Test
public void contextLoads() {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
执行结果:
2018-11-25 22:06:34.619 INFO 27796 — [ main] com.shuyu.state.StartState : 开始状态
Start State
2018-11-25 22:06:34.620 INFO 27796 — [ main] com.shuyu.state.StopState : 结束状态
github代码地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/state
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15824.html