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. 实现原理将key映射到 2^32 - 1 的空间中,将这个数字的首尾相连,形成一个环计算节点(使用节点名称、编号、IP地址)的hash
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- RestTemplate 请求接收自定义400+ 或500+错误场景当服务端自定义400错误返回体时,使用restTemplate 请求接收
- 前提最近我的的朋友浏览一些网站,看到好看的图片,问我有没有办法不用手动一张一张保存图片!我说用Jsoup丫!测试网站打开开发者模式(F12)
- 前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 《Effective Java》1
- Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写。我们常用的类ArithmeticExce
- 一.链表概念链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。逻辑结构:注:1、如上图,相当于火
- 前言:页面静态化其实就是将原来的 * 页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户
- 一,使用背景之前遇到一个需求,是需要将一个json文件解析存储到数据库中。一开始测试的时候,json文件的大小都在几兆以内,所以直接将jso
- 目录首先,写一个需求文档:一、登录界面1.界面2.登录3.退出二、开始游戏界面三、缓冲加载游戏界面四、游戏主界面五、结束界面上代码首先,写一
- 见过一句夸张的话,叫做“没有阅读过jdk源码的人不算学过java”。从今天起开始精读源码。而适合精读的源码无非就是java.io,.util
- 本文实例为大家分享了Android实现屏幕保持常亮的具体代码,供大家参考,具体内容如下一、需求背景当我们在玩游戏或者看视频的时候不希望app
- 前言Feign是Netflix开源的声明式HTTP客户端,致力于让编写http client更加简单,Feign可以通过声明接口自动构造请求
- 一、什么是JSONJSON: JavaScript Object Notation JS对象简谱,是一种类似于XML的语言。相比于XML,它
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 奇怪的不等于(≠)最近,栈长用 IntelliJ IDEA 看源码时发现:咦~这是什么鬼?Java 不等于的写法不是一直都是 != 么?什么
- Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标
- 前言一个说难不难,说简单竟看不出来是哪里问题的一个bug。是的 可能自己能力和经验尚浅无法识别,下面你们能否用火眼金睛一眼让bug原形毕露(
- 在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方案,接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其
- 官方 JSON.NET 地址 http://james.newtonking.com/pages/json-net.aspxXML TO J