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()); } }
5、测试 运行结果如下