游戏研发(策略+sass+回调模式)

前言

        由于这边需要对接游戏研发后台,基本就是开服,封禁.角色日志等,但是每个游戏提供的接口都是不一样的,所以为了统一处理提前进行sass封装,以便后续可以更好的兼容

        

        同时还涉及了多数据源的问题,因为有些日志太大不可能直接去http调用,会使用直接查询游戏研发的数据库方式这一块依然可以进行封装

        

        这里只讨论开发\封禁\角色日志\聊天记录等,其他的接口和功能都是类似的,这里主要是讨论设计方案

前提设计数据库表

游戏表(核心)

idgame_coderoot_pathapp_key
主键id游戏编码(核心)游戏请求根路径游戏密钥
1zxcGamehttp://192.168.0.1/pathsdfsdfdsfdf

服务器器(sass)

idserver_idgame_idstatus
主键id服务器id关联的游戏id状态 0-闭服 1-开服
110004510

Http设计方案

涉及类图

相关描述

AbstractGameCall:  用于抽象定义,并封装了子类可以通用的方法,比如getGame()

ForestImpactGameCallImpl: 其中一个实现子类, 这里是封装的意义,子类实现自己逻辑即可

ForestImpactHttpUtils: 跟子类相匹配的Http请求类,与游戏具体的对接

GameCallContext:  接口上下文, 客户端只需要跟这个类打交道即可

         

        这样的设计以后如果有其他的游戏对接,只需要提供对应的实现和http实现类即可,项目内部会通过getGameCode()方法获取到具体的实现类,这里是唯一需要匹配的地方,抽象类提供的getGame()也是给子类提供了便利,因为gameCode是唯一值所以是可以这样去做的

sass方面设计

        主要存在于以下的几方面

1:  通过getGameCode便可以实现getGame通用方法,进而在进行http调用时,可以获取到具体的appKey进行加密处理,以及rootPath根请求

2: 假设在进行服务器修改状态时,那么就可以根据服务器绑定的gameId获取到具体的实现类,然后再进行相应的处理,只需要在入库时绑定这个关联即可

3: 对外暴露接口时需要对方传递一个固定的gameId参数,那么就可以把接口根据不同游戏来查询数据进行返回,以及解密也可以通过这个来进行自动的匹配

4: 以上几点保证了后续如果有新游戏只需要对提供实现类即可,底层的逻辑是不需要进行调整的

可能存在问题

        解设不同游戏有不同参数,那么也可以在调用过程中通过添加参数,然后子类进行相应的处理即可,当然了还可以提供回调函数的方式让不同实现类进行传输,如果没有多余参数不进行涉及即可

多数据源数据设计方案

        其实逻辑跟上面差不多的,只是像角色信息、聊天信息、用户日志等这部分日志过大,不是很适合用http传递过来,一个是数据量过大,一个是这边也没有那么多的磁盘来存储数据

       

        所以这个就需要依赖对方提供数据库,然后我们这边到不同的数据库中进行数据的获取了,但是仍然可以复用sass的功能对gameId区分然后进行处理

        大概结构也是差不多的,到时看看有时间就补上来一下,待定

结语

        其实用了很多设计模式后发现很多时候都跟抽象类、策略、模板等基本模式脱不了关系,个人认为设计模式绝对是有利于编码的,因为在思考的过程中会自然的把一些可以通用的逻辑封装起来,比如getGame(), 以及appKey和rootPath的获取

       

        如果有合适的场景,也建议大家可以考虑一下如何进行设计,在以后的开发中会带来比较大的变化,比如在下一个游戏的对接,只需要实现子类即可了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端修改接口返回测试工具 Inssman使用教程

之前用的requestly现在要登录才能用了,然后我又登录不上去,同事又推荐了个谷歌插件,试了下,挺好用,还不用登录,用法和之前差不多 下载网站:https://chromewebstore.google.com/detail/inssman-…

mysql json_quote和json_unquote的用法

在 MySQL 中,JSON_QUOTE() 和 JSON_UNQUOTE() 函数与 JSON 数据类型的处理有关。这两个函数在处理 JSON 字符串时特别有用。 JSON_QUOTE() JSON_QUOTE() 函数用于将字符串值转换为有效的 JSON 字符串。它会将特殊字符(如引号、反斜杠等)进行…

从入门到精通:Java Lambda运算符详解!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

力扣 503. 下一个更大元素 II

题目来源:https://leetcode.cn/problems/next-greater-element-ii/description/ C题解:因为是循环数组,所以对数组进行了两次遍历,相当于循环。使用了栈,一个存放元素,一个存放索引,用来更新res…

【C++ | 析构函数】类的析构函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-06 1…

使用MFC DLL

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除 应用程序与DLL链接后,DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。 隐式链接又称为静态加载&…

Linux常见故障处理之df命令卡住不输出

一、背景说明 朋友咨询Linux系统下输入df -h命令后没有任何输出结果,博主的第一反应是/根分区磁盘空间满了,朋友说cd等其他命令可以执行。博主又猜测可能是有人误定义了命令别名,进一步确认命令卡住在等待输出页面。事后博主想起来可能是共享…

[AIGC] “从入门到实践:使用Mockito优雅地处理Java单元测试“

当需要测试的接口依赖多个其他的接口时,我们依旧可以使用Mockito来进行处理。这时候,我们通常会使用到Mockito的InjectMocks和Mock注解。 下面提供一个例子,这个例子描述了一个BookService类,它依赖于另外两个接口:Bo…

C++ 反转单词

在C中,反转一个字符串中的单词(单词之间通过空格分隔,但单词内部保持原有顺序)可以通过以下步骤实现: 找到字符串中的所有单词,这可以通过查找空格来实现。将单词存储在一个容器中(例如 std::v…

代码随想录——删除二叉搜索树中的节点(Leetcode450)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

4-护网需要具备的技能

红队: 外围打点能力漏洞挖掘能力漏洞分析能力权限提升能力权限维持能力钓鱼远控能力代码审计能力木马免杀能力内网渗透能力横向移动能力域渗透能力跨域渗透能力 蓝队: 设备使用能力设备监控能力研判分析能力攻击辨别能力流量分析能力入侵排查能力日志…

RapidJSON

要在项目中使用 RapidJSON 库,需要首先下载并包含该库的头文件。以下是详细的步骤,包括如何下载、引用和使用 RapidJSON: 使用 CMake 引用 RapidJSON 如果你的项目使用 CMake 构建系统,可以按照以下步骤引用 RapidJSON&#xff…

终极GPU互联技术探索:消失的内存墙

一、引言 随着人工智能、大数据、云计算等技术的飞速发展,计算能力的需求呈现出爆炸性增长。在这个背景下,图形处理器(GPU)凭借其强大的并行计算能力,在深度学习、科学计算等领域扮演着越来越重要的角色。然而&#x…

用Pip配置Pytorch环境 (Pytorch==2.3.0)

用Pip配置Pytorch环境 (Pytorch2.3.0) 本文主要讲解: 如何用Conda搭建Pytorch环境,用Conda的方式安装,需要单独去安装Cuda。 1. 下载Python安装包 安装Python 3.10.11,下载地址 Python 3.10.11 2. CUDA 安装 安装CUDA 12.1, …

JavaSE—泛型

1 泛型定义和基本使用 泛型是JDK1.5以后才有的, 可以在编译时期进行类型检查,且可以避免频繁类型转化! Test public void test1() {List list new ArrayList();list.add("ZhangSan");list.add(1);//集合使用 取出元素Object obj…

R语言数据探索和分析22-使用随机森林和聚类算法探索和预测健康状况

一、研究背景 在两个实验中,使用了一组综合性的生物统计数据来探索和预测健康状况(特别是疾病的发生)。实验的核心在于应用高级数据分析技术,具体包括随机森林分类和聚类分析,来洞察和预测个体的健康状况。首先&#…

【十大排序算法】选择排序

选择就像是在谱曲,每个决定就是一个音符,只有将它们有序地安排在一起,才能奏响美妙的乐章。 文章目录 一、选择排序的思想二、选择排序的发展历程三、选择排序具象化四、选择排序算法实现五、选择排序的特性推荐阅读 一、选择排序的思想 选…

Kafka初步学习

kafka消息队列模式 点对点模式:一对一,消费者主动拉取数据,消息收到后消息清除 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息 消息被消费以后,queue中不再有存储,所以消息消费…

【DevOps】网站安全事件分析方法详解和实战分析

目录 一、网站安全事件分析流程 二、常用的网站安全事件分析方法 三、网站被植入挖矿脚本事件分析 1、 事件发现与确认 2、 事件隔离与取证 3、 事件分析与溯源 4、 事件处置与恢复 5、 事件总结与改进 四、网站安全事件分析的关键点 五、提高网站安全事件分析能力的…

python使用appium截图手机屏幕图片

要使用 Appium 截取手机屏幕图片并在电脑上显示,你需要执行几个步骤。以下是一个基本的流程: 设置 Appium 环境:确保你已经安装了 Appium 服务器和 Python 客户端库(如 appium-python-client)。编写 Python 脚本&…