简介
状态模式允许一个对象在其内部【状态】改变的时候改变其【行为】。这个对象看上去就像是改变了它的类一样。 用一句话来表述,状态模式把所研究的对象的【行为】包装在不同的【状态对象】里,【每一个状态对象】都属于【一个抽象状态类的一个子类】。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。 状态模式将每【一个条件分支】放入【一个独立的类】中。 这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
角色
- 环境类Context:定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义当前状态
- 抽象状态类State:定义一个接口以封装与Context的一个特定状态相关的【行为】
- 具体状态类ConcreteState:每一子类实现【一个】与Context的【一个】状态相关的【行为】
适用性
- 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 2.一个操作中含有庞大的多分支的,且这些分支依赖于该对象的状态。 这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。
通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为。 作用:将主对象和其状态分离,【状态对象】负责主对象的【状态转换】,使主对象类功能减轻 java.util.Iterator javax.faces.lifecycle.LifeCycle#execute()
演示
/** 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态 */ public class Context { //定义出所有的电梯状态 public static OpenningState openningState; public static ClosingState closeingState; public static RunningState runningState; public static StoppingState stoppingState; //定一个当前电梯状态 private IState state; public IState getState() { return state; } public Context() { openningState = new OpenningState(this); closeingState = new ClosingState(this); runningState = new RunningState(this); stoppingState = new StoppingState(this); } public void setState(IState state) { this.state = state; //把当前的环境通知到各个实现类中 } public void open() { state.open(); } public void close() { state.close(); } public void run() { state.run(); } public void stop() { state.stop(); } }
/**抽象状态类State,定义一个接口以封装与Context的一个特定状态相关的行为*/ public interface IState { /**电梯门开启动作*/ public abstract void open(); /**电梯关闭动作*/ public abstract void close(); /**电梯运行动作*/ public abstract void run(); /**电梯停止运行动作*/ public abstract void stop(); } //****************************************************************************************** /**具体状态类ConcreteState,每一子类实现【一个】与Context的【一个】状态相关的行为。本类定义在电梯门开启的状态下能做什么事情*/ class OpenningState implements IState { /**定义一个环境角色,也就是封装状态的变换引起的功能变化*/ protected Context context; public OpenningState(Context context) { this.context = context; } @Override public void open() { //开门。Openning 状态是由 open()方法产生的,因此这个方法中肯定有一个具体的、独特的业务逻辑 System.out.println("电梯门开启..."); } @Override public void close() { //电梯门开启状态下关闭电梯门 context.setState(Context.closeingState);//状态修改 context.getState().close(); //动作委托给CloseState来执行 } @Override public void run() { System.out.println("------------------电梯门开启状态下运行?要死啊,你!"); } @Override public void stop() { System.out.println("------------------电梯门开启状态下停止?额,这个本来就应该是这样的吧!"); } } //****************************************************************************************** class ClosingState implements IState { protected Context context; public ClosingState(Context context) { this.context = context; } @Override public void close() {//电梯门关闭 System.out.println("电梯门关闭..."); } @Override public void open() {//电梯门关闭状态下打开 context.setState(Context.openningState); context.getState().open(); } @Override public void run() {//电梯门关闭状态下运行 context.setState(Context.runningState); context.getState().run(); } @Override public void stop() {//电梯门关闭状态下停止 context.setState(Context.stoppingState); context.getState().stop(); } } //****************************************************************************************** class RunningState implements IState { protected Context context; public RunningState(Context context) { this.context = context; } @Override public void close() { System.out.println("------------------运行状态下关闭电梯门?电梯门本来就是关着的!"); } @Override public void open() { System.out.println("------------------运行状态下开电梯门?你疯了!"); } @Override public void run() { //运行 System.out.println("电梯上下跑..."); } @Override public void stop() {//运行状态下停止 context.setState(Context.stoppingState); context.getState().stop(); } } //****************************************************************************************** class StoppingState implements IState { protected Context context; public StoppingState(Context context) { this.context = context; } @Override public void close() { System.out.println("------------------停止状态下关门?电梯门本来就是关着的!"); } @Override public void open() {//停止状态下开门 context.setState(Context.openningState); context.getState().open(); } @Override public void run() {//停止状态下运行 context.setState(Context.runningState); context.getState().run(); } @Override public void stop() {//停止 System.out.println("电梯停止了..."); } }
public class Test { public static void main(String[] args) { Context context = new Context(); test(context, new OpenningState(context)); test(context, new ClosingState(context)); test(context, new RunningState(context)); test(context, new StoppingState(context)); } public static void test(Context context, IState state) { System.out.println("【" + state.getClass().getSimpleName() + "】"); for (int i = 0; i < 4; i++) { context.setState(state); switch (i) { case 0: context.open(); break; case 1: context.close(); break; case 2: context.run(); break; case 3: context.stop(); break; } } System.out.println(); } }
附件列表
时间: 2024-10-06 08:58:44