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();
}
}
在上面这个例子中,首先我们定义了一个State接口,然后我们定义三个具体的状态类,IdleState,MoveState和AttackState,分别表示主人公的空闲状态,移动状态和攻击状态,这些状态都实现了State接口.接下来我们定义了一个上下文Context,它包含了一个State对象,表示当前的状态.在Context类中,我们定义了一个setState方法用于改变状态,以及move和attack方法用于执行相应的操作.
来源:https://blog.csdn.net/qq_43135259/article/details/129690380
标签:Java,状态,设计模式,对象状态转换
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android实现手机多点触摸画圆
2022-03-23 06:23:16
![](https://img.aspxhome.com/file/2023/6/130426_0s.jpg)
Unity实现Flappy Bird游戏开发实战
2023-03-10 19:56:58
![](https://img.aspxhome.com/file/2023/6/89856_0s.jpg)
C#使用NPOI实现Excel导入导出功能
2022-11-01 22:36:19
![](https://img.aspxhome.com/file/2023/3/100113_0s.jpg)
Java保留两位小数的几种写法总结
2022-04-19 06:53:06
Android 获取随机验证码功能示例
2023-01-22 10:03:27
Java双冒号(::)运算符使用详解
2022-03-31 11:18:17
![](https://img.aspxhome.com/file/2023/2/65612_0s.png)
winform实现五子棋游戏
2023-05-31 19:14:24
Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)
2021-09-27 18:56:46
![](https://img.aspxhome.com/file/2023/0/120160_0s.png)
java实现小i机器人api接口调用示例
2023-02-05 00:09:15
java操作mongodb示例分享
2023-09-07 19:00:02
详解Maven安装教程及是否安装成功
2021-07-14 00:00:21
![](https://img.aspxhome.com/file/2023/3/61673_0s.png)
一篇超详细的Spring Boot整合Mybatis文章
2022-01-27 10:02:58
![](https://img.aspxhome.com/file/2023/3/72313_0s.jpg)
Android接入阿里云热修复介绍
2023-09-16 08:53:01
Java开发学习 Eclipse项目有红感叹号解决之道
2022-10-22 15:29:27
JavaWeb实现用户登录与注册功能(服务器)
2022-12-19 13:28:31
![](https://img.aspxhome.com/file/2023/4/99714_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/4/98684_0s.jpg)
一文探索Java文件读写更高效方式
2021-12-20 08:31:22