1、简介
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
状态模式允许一个对象在其内部状态改变时改变其行为,这个对象看上去就像改变了他的类一样
2、状态模式类图

3、状态模式涉及到的角色
从上图可以看出 状态模式涉及到以下几个角色
3.1、抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为
3.2、具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对应的行为
3.3、环境(Context)角色:环境角色持有一个状态类的实例,这个状态类的实例给出环境对象的现有状态
4、源代码
4.1、抽象状态角色
package State;
/**
* ********************************************************
* @ClassName: State
* @Description: 抽象状态接口
***********************************************************
*/
public interface State {
String SimpleOperation();
}
4.2、具体状态角色1
package State;
/**
* ********************************************************
* @ClassName: ConcreteState
* @Description: 具体状态类
***********************************************************
*/
public class Sit implements State{
@Override
public String SimpleOperation() {
return "我坐下了";
}
}
4.3、具体状态角色2
package State;
/**
* ********************************************************
* @ClassName: Stand
* @Description: 具体状态类
***********************************************************
*/
public class Stand implements State{
@Override
public String SimpleOperation() {
return "我站起来了";
}
}
4.4、环境角色
package State;
/**
* ********************************************************
* @ClassName: Context
* @Description:环境类 环境类持有一个State对象 并把所有的行为委派给此对象
***********************************************************
*/
public class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public String stateManage(){
return state.SimpleOperation();
}
}
4.5、测试客户端
package State;
/**
* ********************************************************
* @ClassName: Client
* @Description: 状态模式测试客户端
***********************************************************
*/
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setState(new Sit());
System.out.println(context.stateManage());
context.setState(new Stand());
System.out.println(context.stateManage());
}
}