当前位置: 首页 > news >正文

[多态设计模式]枚举

背景:

游戏服务器中,多态可以说体现的淋漓尽致。

如:

1.开启条件。有的系统是根据玩家等级,有的是根据通关第几关。

2.商店可能有不同类型的商店。

3.任务系统中,不同的计数类型,不同的任务目标类型。

4.功能开启中,不同的系统开启条件不同。

....

稍微复杂一点的系统都会涉及到多态。

我们往往需要采用一种一致的接口去处理,这样子可以避免冗余代码。但是他们需要的数据却不同。

经过我的实践,我觉得一种比较好的写法如下:

ETest.java  // 枚举所有的类型

package org.example.enumDuoTai;import org.example.enumDuoTai.data.ATestData;
import org.example.enumDuoTai.data.BTestData;
import org.example.enumDuoTai.data.ITestData;public enum ETest {A {@Overridepublic void test(ITestData data) {ATestData aTestData = data.get();System.out.println("roleId="+ aTestData.getRoleId() + " a=" + aTestData.getA());}},B {@Overridepublic void test(ITestData data) {BTestData bTestData = data.get();System.out.println("sn="+ bTestData.getSn() + " B=" + bTestData.getB());}},;public abstract void test(ITestData data);
}

ITestData.java // 数据接口

package org.example.enumDuoTai.data;@SuppressWarnings("all")
public interface ITestData {default <T extends ITestData> T get(){return (T)this;}
}

ATestData.java // 数据参数实现1

package org.example.enumDuoTai.data;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class ATestData implements ITestData{private long roleId;private int a;
}

BTestData.java // 数据参数实现

package org.example.enumDuoTai.data;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class BTestData implements ITestData{private int sn;private String b;
}

Main.java

package org.example.enumDuoTai;import org.example.enumDuoTai.data.ATestData;
import org.example.enumDuoTai.data.BTestData;public class Main {public static void main(String[] args) {ETest.A.test(new ATestData(4097, 1));ETest.B.test(new BTestData(1001, "jn"));}
}/*
roleId=4097 a=1
sn=1001 B=jn*/

总结:

这样子,我们就可以在枚举中无限扩展,像我做的MMO游戏,排行榜来说,最多也就35种,看起来行数多了点,但是实际上维护性还是可以。这种枚举的多态,实现比较简单。

这样子通过接口,让所有的操作都是强类型的,是比较简单的。

而且枚举有values,天然实现了遍历,也就是工厂模式。

http://www.lryc.cn/news/175128.html

相关文章:

  • 【QT】QRadioButton的使用(17)
  • 力扣:105. 从前序与中序遍历序列构造二叉树(Python3)
  • 【含java2023面试题】HashMap、HashTable、ConcurrentHashMap
  • AT24C02芯片
  • Python+Django前后端分离
  • win11系统固定到快速访问的文件夹无法调整顺序的问题
  • 短视频矩阵系统,短视频矩阵源码技术开发
  • Flask 数据库 连接池、DBUtils、http 连接池
  • Day 01 python学习笔记
  • CSharp Library develop histroy
  • 林木种苗生产vr虚拟实训教学降低培训等待周期
  • LabVIEW在运行时调整表控件列宽
  • 【6 ElementUI Tabs控件第二个tab页签Div宽度缩小的问题】
  • 读写分离MySQL
  • MySQL数据库用户管理
  • package.json属性
  • C# 把m4a格式文件转为MP3格式
  • 【分享】Word文档如何批量转换成PDF?
  • dedecms tag 伪静态 数字版本
  • mysql数据库ip被阻断
  • Nginx WEB访问与Linux授权约束
  • 影响独立服务器稳定运行的因素
  • Xcode14.3.1打包报错Command PhaseScriptExecution failed with a nonzero exit code
  • [RF学习记录][ssh library][execute Command】关键字的返回值
  • 【Python入门教程】Python实现猜数字小游戏
  • vue项目打包部署到服务器,报错。
  • 适用于初学者,毕业设计的5个c语言项目,代码已开源
  • 虾皮商品详情数据接口
  • 数据大爆炸:大数据分析如何改变我们的世界
  • WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境