软件编程
位置:首页>> 软件编程>> java编程>> Java状态设计模式实现对象状态转换的优雅方式

Java状态设计模式实现对象状态转换的优雅方式

作者:.番茄炒蛋  发布时间:2023-11-20 10:33:59 

标签:Java,状态,设计模式,对象状态转换

介绍

Java状态模式(State Pattern)是一种面向对象的设计模式,它将对象的状态封装成独立的状态对象,并将对象的行为与状态对象解耦,它允许对象在其内部状态发生改变时,改变其行为.该模式将对象的行为封装在不同的状态对象中,而不是将所有的行为都放在一个类中.

Java状态模式通产由以下3种角色组成:

  • 状态接口(State Interface):定义了一组与上下文对象相关的方法,这些方法将在不同状态下被具体对象实现.

  • 具体状态(Concrete State):实现了状态接口,具体状态对象是不同的状态实现.

  • 上下文(Context):具有多种状态的对象,上下文对象可以在运行时改变状态,从而改变它的行为.

需要注意的是,Java状态模式的实现有多种方式,如使用接口和抽象类实现状态,使用枚举实现状态等.具体的实现方式取决于具体的需求和场景.

实现

假设我们有一个简单的游戏,游戏中的主人公可以在不同的状态下进行不同的操作.我们可以使用状态模式来实现这个游戏的设计.

状态接口

public interface State {
   /**
    * 移动
    */
   void move();
   /**
    * 攻击
    */
   void attack();
}

具体状态

public class IdleState implements State{
   /**
    * 移动
    */
   @Override
   public void move() {
       System.out.println("静止状态下不能移动...");
   }
   /**
    * 攻击
    */
   @Override
   public void attack() {
       System.out.println("静止状态下不能攻击...");
   }
}
public class MoveState implements State{
   /**
    * 移动
    */
   @Override
   public void move() {
       System.out.println("移动中...");
   }
   /**
    * 攻击
    */
   @Override
   public void attack() {
       System.out.println("移动状态下不能攻击...");
   }
}
public class AttackState implements State{
   /**
    * 移动
    */
   @Override
   public void move() {
       System.out.println("攻击状态下不能移动...");
   }
   /**
    * 攻击
    */
   @Override
   public void attack() {
       System.out.println("攻击中...");
   }
}

上下文

public class Context {
   private State state;
   public Context() {
       // 默认静止状态
       this.state = new IdleState();
   }
   public void setState(State state) {
       this.state = state;
   }
   /**
    * 移动
    */
   public void move() {
       state.move();
   }
   /**
    * 攻击
    */
   public void attack() {
       state.attack();
   }
}

测试

public class Demo {
   public static void main(String[] args) {
       // 静止状态
       Context context = new Context();
       context.move();
       context.attack();
       // 移动状态
       context.setState(new MoveState());
       context.move();
       context.attack();
       // 攻击状态
       context.setState(new AttackState());
       context.move();
       context.attack();
   }
}

Java状态设计模式实现对象状态转换的优雅方式

在上面这个例子中,首先我们定义了一个State接口,然后我们定义三个具体的状态类,IdleState,MoveState和AttackState,分别表示主人公的空闲状态,移动状态和攻击状态,这些状态都实现了State接口.接下来我们定义了一个上下文Context,它包含了一个State对象,表示当前的状态.在Context类中,我们定义了一个setState方法用于改变状态,以及move和attack方法用于执行相应的操作.

来源:https://blog.csdn.net/qq_43135259/article/details/129690380

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com