一、概念
状态模式(State Pattern):类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
使用场景: 一个对象的行为由它的状态决定,而且它必须在运行时根据自身状态改变它的行为。
二、实现
这里控件MediaPlayer状态机转换做例子,状态装换如下图:
1、 状态机接口
public interface State {
String getName();
void start(StateMachine stateMachine);
void pause(StateMachine stateMachine);
void stop(StateMachine stateMachine);
void prepare(StateMachine stateMachine);
}
2、状态实现类,这里代码只贴了两个状态,其他都类似。
#PausedState
public class PausedState implements State {
private static final PausedState instance = new PausedState();
public static State getInstance() {
return instance;
}
@Override
public void start(StateMachine stateMachine) {
System.out.println("进入start前的准备工作");
stateMachine.setState(StartedState.getInstance());
}
@Override
public void pause(StateMachine stateMachine) {
}
@Override
public void stop(StateMachine stateMachine) {
System.out.println("进入stop前的准备工作");
stateMachine.setState(StoppedState.getInstance());
}
@Override
public void prepare(StateMachine stateMachine) {
}
@Override
public String getName() {
return "paused";
}
}
#StartedState
public class StartedState implements State {
private static final StartedState instance = new StartedState();
public static State getInstance() {
return instance;
}
@Override
public void start(StateMachine stateMachine) {
}
@Override
public void pause(StateMachine stateMachine) {
System.out.println("进入pause前的准备工作");
stateMachine.setState(PausedState.getInstance());
}
@Override
public void stop(StateMachine stateMachine) {
System.out.println("进入stop前的准备工作");
stateMachine.setState(StoppedState.getInstance());
}
@Override
public void prepare(StateMachine stateMachine) {
}
@Override
public String getName() {
return "started";
}
}
3、状态机
public class StateMachine {
private State state = PreparedState.getInstance();
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void start() {
state.start(this);
}
public void pause() {
state.pause(this);
}
public void stop() {
state.stop(this);
}
public void prepare() {
state.prepare(this);
}
}
4、测试类
public class Client {
public static void main(String[] args) {
StateMachine stateMachine = new StateMachine();
System.out.println("现在的状态:" + stateMachine.getState().getName());
stateMachine.start();
System.out.println("现在的状态:" + stateMachine.getState().getName());
stateMachine.pause();
System.out.println("现在的状态:" + stateMachine.getState().getName());
}
}
5、运行结果
总结:个人理解,使用场景就是包含有多种状态,且状态间可通过一些操作进行转换。正常硬代码实现,就是if-else
判断当前状态,切换为下一个状态。为了避免过多状态及操作代码耦合,将各个状态都单独拆出来,在状态类中加入状态流转逻辑,把执行操作抽离到StateMachine
中实现解耦。
参考文章:
状态模式(state pattern)