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

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

介绍

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

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

猜你喜欢

  • Android实现手机多点触摸画圆

    2022-03-23 06:23:16
  • Unity实现Flappy Bird游戏开发实战

    2023-03-10 19:56:58
  • C#使用NPOI实现Excel导入导出功能

    2022-11-01 22:36:19
  • Java保留两位小数的几种写法总结

    2022-04-19 06:53:06
  • Android 获取随机验证码功能示例

    2023-01-22 10:03:27
  • Java双冒号(::)运算符使用详解

    2022-03-31 11:18:17
  • winform实现五子棋游戏

    2023-05-31 19:14:24
  • Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    2021-09-27 18:56:46
  • java实现小i机器人api接口调用示例

    2023-02-05 00:09:15
  • java操作mongodb示例分享

    2023-09-07 19:00:02
  • 详解Maven安装教程及是否安装成功

    2021-07-14 00:00:21
  • 一篇超详细的Spring Boot整合Mybatis文章

    2022-01-27 10:02:58
  • Android接入阿里云热修复介绍

    2023-09-16 08:53:01
  • Java开发学习 Eclipse项目有红感叹号解决之道

    2022-10-22 15:29:27
  • JavaWeb实现用户登录与注册功能(服务器)

    2022-12-19 13:28:31
  • Android仿微信长按录制视频并播放功能

    2023-02-16 23:26:33
  • C#绘制飞行棋地图小程序

    2021-11-20 23:19:10
  • C#动态执行批处理命令的方法

    2023-03-16 23:19:40
  • 教你安装配置Android Studio

    2023-07-09 03:26:17
  • 一文探索Java文件读写更高效方式

    2021-12-20 08:31:22
  • asp之家 软件编程 m.aspxhome.com