在Java中,描述设计模式

状态设计模式是一种行为设计模式之一。当一个对象根据其内部状态改变其行为时,会使用状态设计模式。

状态设计模式

如果我们需要根据对象的状态来改变其行为,我们可以在对象中設置一个状态变量。然后使用 if-else 条件块根据状态执行不同的操作。状态设计模式通过上下文和状态的具体实现提供了一种系统化且松散耦合的方式来实现这一目标。状态模式的上下文是一个类,它具有对状态的引用,该状态是状态的具体实现之一。上下文将请求转发给状态对象进行处理。让我们通过一个简单的例子来理解。假设我们想要实现一个带有简单按钮执行动作的电视遥控器。如果状态是“开启”,它将打开电视;如果状态是“关闭”,它将关闭电视。我们可以使用以下的 if-else 条件来实现;TVRemoteBasic.java

package com.Olivia.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();
	}

}

请注意,客户端代码应该知道用于设置远程状态的具体值。此外,如果状态的数量增加,实现与客户端代码之间的紧密耦合将非常难以维护和扩展。现在,我们将使用状态模式来实现上述TV遥控器示例。

状态设计模式接口

首先,我们将创建一个State接口,它将定义不同具体状态和上下文类应该实现的方法。State.java

package com.Olivia.design.state;

public interface State {

	public void doAction();
}

状态模式具体状态实现

在我们的示例中,我们可以有两个状态 – 一个是打开电视的状态,另一个是关闭电视的状态。因此,我们将为这些行为创建两个具体的状态实现。TVStartState.java

package com.Olivia.design.state;

public class TVStartState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned ON");
	}

}

电视停止状态.java

package com.Olivia.design.state;

public class TVStopState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned OFF");
	}

}

现在我们准备实现我们的上下文对象,它将根据其内部状态改变其行为。

状态设计模式的上下文实现

TVContext.java

package com.Olivia.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();
	}

}

注意到上下文还实现了状态接口,并保存对当前状态的引用,将请求转发给状态实现。

状态设计模式测试程序

现在让我们编写一个简单的程序来测试我们对电视遥控器的状态模式实现。文件名为TVRemote.java。

package com.Olivia.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();
		
	}

}

上面程序的输出与不使用状态模式的基本电视遥控器实现相同。

状态设计模式的好处

使用状态模式来实现多态行为的好处非常明显。错误的几率较低,而且很容易为额外的行为添加更多的状态。因此,使我们的代码更加健壮、易于维护和灵活。同时状态模式有助于避免在这种情况下使用 if-else 或 switch-case 条件逻辑。状态模式与策略模式非常相似,在Java中也可以查看策略模式。这就是关于Java中状态设计模式的全部内容,希望你喜欢。

发表回复 0

Your email address will not be published. Required fields are marked *