Java 中的状态设计模式
状态设计模式是行为设计模式之一。当对象根据其内部状态改变其行为时使用状态设计模式。
状态设计模式
如果我们必须根据对象的状态改变其行为,我们可以在对象中拥有一个状态变量。然后使用if-else条件块根据状态执行不同的操作。状态设计模式用于提供一种系统的、松散耦合的方式通过Context
和State
实现来实现这一点。状态模式Context是具有对 State 具体实现之一的 State 引用的类。Context 将请求转发到状态对象进行处理。让我们通过一个简单的例子来理解这一点。假设我们要实现一个带有简单按钮的电视遥控器来执行操作。如果状态为 ON,它将打开电视,如果状态为 OFF,它将关闭电视。我们可以使用如下所示的 if-else 条件来实现它;TVRemoteBasic.java
package com.journaldev.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.journaldev.design.state;
public interface State {
public void doAction();
}
状态设计模式具体状态实现
在我们的示例中,我们可以有两个状态 - 一个用于打开电视,另一个用于关闭电视。因此,我们将为这些行为创建两个具体的状态实现。TVStartState.java
package com.journaldev.design.state;
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
TVStopState.java
package com.journaldev.design.state;
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
现在我们准备实现我们的 Context 对象,它将根据其内部状态改变其行为。
状态设计模式上下文实现
TVContext.java
package com.journaldev.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 并保留其当前状态的引用,并将请求转发给状态实现。
状态设计模式测试程序
现在让我们编写一个简单的程序来测试 TV Remote 的状态模式实现。TVRemote.java
package com.journaldev.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 条件逻辑。状态模式与策略模式非常相似,请查看Java 中的策略模式。以上就是关于 Java 中的状态设计模式的全部内容,希望您喜欢。