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

游戏研发(策略+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的获取

       

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

相关文章:

  • spring入门
  • 【二进制部署k8s-1.29.4】十一、metallb的安装部署
  • 【FPGA】Verilog语言从零到精通
  • Unity世界坐标下UI始终朝向摄像机
  • LangChain学习之prompt格式化与解析器使用
  • FreeReg运行笔记
  • vim常用使用技巧
  • 多目标应用:NSGA2求解无人机三维路径规划(MATLAB代码)
  • 【C++题解】1074 - 小青蛙回来了
  • CLion配置
  • 在今日头条上写文章:ChatGPT完整使用教程
  • 【qt】项目移植
  • elk:使用filebeat采集日志发送到kafka
  • Java装饰器模式,装饰器模式通常通过创建一个接口和一个或多个实现了该接口的类来开始,然后创建装饰器类,这些类也实现了相同的接口
  • MC联机无法连接到服务器怎么解决
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular6错误 Service: No provider for Renderer2
  • js继承的实现方法
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • win10下安装mysql5.7
  • 从零开始的无人驾驶 1
  • 简单实现一个textarea自适应高度
  • 面试遇到的一些题
  • 漂亮刷新控件-iOS
  • 前端攻城师
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用common-codec进行md5加密
  • 数据科学 第 3 章 11 字符串处理
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 1.Ext JS 建立web开发工程
  • FaaS 的简单实践
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #Linux(帮助手册)
  • #职场发展#其他
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (WSI分类)WSI分类文献小综述 2024
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)创业家杂志:UCWEB天使第一步
  • .NET Core 中插件式开发实现
  • .NET Core 中的路径问题
  • .Net Remoting常用部署结构
  • .NET Remoting学习笔记(三)信道
  • .NET成年了,然后呢?
  • @Mapper作用
  • []我的函数库
  • [20160902]rm -rf的惨案.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [c++] 自写 MyString 类
  • [DevOps云实践] 彻底删除AWS云资源
  • [LeetBook]【学习日记】数组内乘积
  • [LeetCode] 148. Sort List 链表排序
  • [LeetCode周赛复盘] 第 310 场周赛20220911
  • [lesson17]对象的构造(上)