Java中的状态设计模式
状态设计模式是行为设计模式之一。
当对象根据其内部状态更改其行为时,将使用状态设计模式。
状态设计模式
如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量。
然后,使用if-else条件块根据状态执行不同的操作。
状态设计模式用于通过"上下文"和"状态"实现提供一种系统的,松散耦合的方式来实现此目的。
状态模式上下文是一类,具有引用国家的具体实现之一的国家。
上下文将请求转发到状态对象以进行处理。
让我们用一个简单的例子来理解这一点。
假设我们想用一个简单的按钮实现一个电视遥控器来执行操作。
如果状态为ON,则将打开电视;如果状态为OFF,则将关闭电视。
我们可以使用if-else条件来实现它,如下所示;
TVRemoteBasic.java
package com.theitroad.design.state; public class TVRemoteBasic { private String state=""; public void setState(String state){ this.state=state; } public void doAction(){ if(state.equalsIgnoreCase("ON")){ System.out.println("TV is turned ON"); }else if(state.equalsIgnoreCase("OFF")){ System.out.println("TV is turned OFF"); } } public static void main(String args[]){ TVRemoteBasic remote = new TVRemoteBasic(); remote.setState("ON"); remote.doAction(); remote.setState("OFF"); remote.doAction(); } }
注意,客户端代码应知道用于设置远程状态的特定值。
此外,如果状态数量增加,则实现和客户端代码之间的紧密耦合将很难维护和扩展。
现在我们将使用状态模式来实现上面的电视遥控器示例。
状态设计模式接口
首先,我们将创建State接口,该接口定义应由不同的具体状态和上下文类实现的方法。
State.java
package com.theitroad.design.state; public interface State { public void doAction(); }
状态设计模式的具体状态实现
在我们的示例中,我们可以有两种状态-一种用于打开电视,另一种用于关闭电视。
因此,我们将针对这些行为创建两个具体的状态实现。
TVStartState.java
package com.theitroad.design.state; public class TVStartState implements State { @Override public void doAction() { System.out.println("TV is turned ON"); } }
TVStopState.java
package com.theitroad.design.state; public class TVStopState implements State { @Override public void doAction() { System.out.println("TV is turned OFF"); } }
现在我们准备实现Context对象,该对象将根据其内部状态更改其行为。
状态设计模式上下文实现
TVContext.java
package com.theitroad.design.state; public class TVContext implements State { private State tvState; public void setState(State state) { this.tvState=state; } public State getState() { return this.tvState; } @Override public void doAction() { this.tvState.doAction(); } }
注意,Context还实现了State并保留了其当前状态的引用,并将请求转发给State的实现。
状态设计模式测试程序
现在,让我们编写一个简单的程序来测试我们的电视遥控器的状态模式实现。
TVRemote.java
package com.theitroad.design.state; public class TVRemote { public static void main(String[] args) { TVContext context = new TVContext(); State tvStartState = new TVStartState(); State tvStopState = new TVStopState(); context.setState(tvStartState); context.doAction(); context.setState(tvStopState); context.doAction(); } }
以上程序的输出与TV Remote的基本实现相同,但未使用状态模式。
状态设计模式的好处
使用状态模式实现多态行为的好处显而易见。
错误的机会更少,为其他行为添加更多状态非常容易。
从而使我们的代码更加健壮,易于维护和灵活。
在这种情况下,状态模式还有助于避免if-else或者switch-case条件逻辑。