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


猜你喜欢
- 方法1 :利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。但是如果返回的对象是一个数
- 由于 * 一般都比较难理解,程序设计者会设计一个 * 接口供开发者使用,开发者只要知道 * 接口的方法、含义和作用即可,无须知道 * 是
- 很多时候忘记Android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能
- 死锁问题死锁定义多线程编程中,因为抢占资源造成了线程无限等待的情况,此情况称为死锁。死锁举例注意:线程和锁的关系是:一个线程可以拥有多把锁,
- String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。如:String gr
- 本文实例为大家分享了Unity创建平铺网格地图的具体代码,供大家参考,具体内容如下创建预制件先拖进场景,再从层级拖回资源选中源图像文件,设置
- 相信大家最关心的肯定不是什么一大堆的破理论,然后还似懂非懂的,最关心得莫过于服务之间的参数传递,数据获取。Ok,今天就告诉大家三种微服务之间
- 前言qq最近更新搞了渐变式状态栏.然后...新需求就是要加这个.唉先来张效果图:常见的方式:设置Theme,状态栏透明. <item
- Java Hibernate对象
- 本文实例讲述了C#自定义RSA加密解密及RSA签名和验证类。分享给大家供大家参考。具体分析如下:这个C#类自定义RSA加密解密及RSA签名和
- 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下:在编写WinForm访问WebService时,常会
- 引言在之前的文章里,我们聊到了 Java 标准库中 HashMap 与 LinkedHashMap 的实现原理。HashMap 是一个标准的
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:package wxapi.WxHelper; import java.io.Buffe
- 本文实例讲述了Android编程实现禁止系统锁屏与解锁亮屏的方法。分享给大家供大家参考,具体如下:需求:某个时刻任务执行完毕,关闭屏幕,某时
- 前言大家在初学java的时候,大部分的代码都是在控制台上运行的.可能大家辛辛苦苦写了几十行代码,最终就只是在控制台输出一个字符,这个时候,心
- App Crash对于用户来讲是一种最糟糕的体验,它会导致流程中断、app口碑变差、app卸载、用户流失、订单流失等。相关数据显示,当And
- 前一段时间遇到一个问题,是关于读取项目中文件资源的问题。我是一个maven工程 我把一张照片放到resource下面,然后在本地读取的时候可
- public class Change{ public static void main(String args[]){ fin
- Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies {//最新版本 &nbs
- 内存对齐的基本原则:结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置