状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是的当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

好处:消除庞大的条件分支语句,将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值