![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
设计模式
.net core game
致力于.net core全栈游戏服务器开发
展开
-
游戏服务器整体架构思考
有的可以进行一些设计,比如:router,我一个服务器,可能既处理mj,又处理斗地主,又处理五子棋。注意的是:不要和Manager搞混了,就算是有Manager,也需要独立出来,然后new一个对象处理,我们对外只暴露service接口给各个服务使用,而不是去调用manager中的细节。启动的时候,肯定要整合下controller接入层,不管是叫:router还是啥,其实本质是接入层,别人发来请求后,我起码得知道到哪里启动呀。有了上面整体的2层架构,一切逻辑就会清晰起来,知道各自模块的职责。原创 2024-01-04 11:46:10 · 616 阅读 · 3 评论 -
IClassQuery实现类的转换
可见实现了IClassQuery接口后,就可以进行转换,我们可以在CoinRoom中加入自己的特色(实现Coin相关的接口)即可。原创 2024-01-03 11:15:30 · 300 阅读 · 0 评论 -
重构客户端RoomScene模块的思考
1.函数名字的命名initXXX ->只调用一次比如:设置当前的玩法,那么在这个里面调用一次即可,不应该又在这里调用,又在其它的里面调用,很容易出错updateXXX ->调用多次比如:人数的刷新,可能过段时间就调用一次,因此不要起一个init方法2.当前是什么玩法,玩法处于哪个阶段。一个模块只能干一件事情。避免写大量的if else,看看能否可采用配置的形式去实现if playT...原创 2017-09-22 16:24:58 · 582 阅读 · 1 评论 -
Builder设计模式
我们往往不想一下子从构造方法里面把参数传递过去,而是一个个参数构造。此时就用到Builder设计模式。比如:属性计算中,我们构造各个方法。原创 2023-12-07 21:04:39 · 395 阅读 · 0 评论 -
【Wrapper上下文包装器模式】
2.对属性计算的需求,我们可以包装处MTHero, 然后整理出所有的属性,从而计算出升级战力变化等。1.不管是什么类型的Redis,我们都可以包装为:GameRedis。原创 2023-12-07 21:02:55 · 352 阅读 · 0 评论 -
[多态设计模式] 方法1:枚举+强转 方法2:泛型+接口
总结:这样子,我们就可以在枚举中无限扩展,像我做的MMO游戏,排行榜来说,最多也就35种,看起来行数多了点,但是实际上维护性还是可以。这种枚举的多态,实现比较简单。我们往往需要采用一种一致的接口去处理,这样子可以避免冗余代码。但是他们需要的数据却不同。游戏服务器中,多态可以说体现的淋漓尽致。如:开启条件,玩家等级,通关。商店可能有不同类型的商店。原创 2023-09-25 18:48:45 · 252 阅读 · 0 评论 -
游戏服务器架构经典设计模式-包装器Warp模式
由于我们想少一个参数,不想带上模块号,往往是:根据msgId的范围进行人为的约定,再根据玩家的逻辑层标识,就知道了当前应该是:哪个进程上哪个线程处理。游戏中,则直接读取数据库(如:每日登录、任务系统..这种带db的系统)转发到MMO场景层的某个逻辑Mod中处理(如:副本、场景活动玩法)这个名字是我自己创造的,不在23个设计模式之中,我认为它非常重要。转发到中心服处理(根据GS上玩家的跨服状态)从中心服发到GS上的Logic层。未授权(只转发给登录模块)原创 2023-07-04 10:46:33 · 158 阅读 · 0 评论 -
深刻理解JDK动态代理的本质 1.反射 2.动态生成代码 3.重新编译生成class文件并加载运行
1)打断点,可以发现实际会生成新的对象去调用findLove。 把文件序列化到E盘2)使用JAD把class文件反编译出来// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://www.kpdus.com/jad.html// Decompiler options: packimports(3) import com.gupaoedu.vip.pattern..原创 2020-08-25 23:33:28 · 495 阅读 · 0 评论 -
【上下文设计模式】1.场景param 2.网络包
1.例子1: 场景param这个其实用的很广,比如:玩法1是匹配时,匹配的2只队伍。 玩法2是:匹配的2个人,玩法3是5个参数。。。这时可以传入一个SceneContext类,里面是一个HashMap,将可变参数放入Map中,然后再这个逻辑类中解析。不同的玩法需要的上下文参数不同时,有时又不想定义一个类,那么就可以使用HashMap<String, Object>这种方式存储,毕竟在使用时,自己是知道有 哪些字段及其每个字段的含义的。2.例子2: 网络包收发收到网络包时,原创 2021-10-20 09:49:47 · 101 阅读 · 0 评论 -
【单例设计模式(起服时初始化)】 1.reflections 2.起服时initialize
InstanceManager.javapackage org.example.testmgr;import org.reflections.Reflections;import java.util.Map;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;public abstract class InstanceManager { private static Map<String,原创 2021-10-12 18:14:22 · 134 阅读 · 0 评论 -
【观察者模式】1.一个模块变化通知其它模块 2.任务系统
1)一个模块变化通知其它模块其实我不建议一个xxxHandler中既要处理普通的业务,又要处理Listener,这样子会看起来比较混乱。而是EventManager.java中只处理public class EventManager { public static onServerStartBegan(){} public static onRoleLevelUp(){ RewardService.ca...原创 2021-10-08 11:55:10 · 103 阅读 · 0 评论 -
【惯用法:模板方法+建造者模式】interface(build接口)+abstract(声明构建步骤)+多个实现子类
毫无疑问,多态是java这类面向对象最有价值的地方,接口和抽象类可以帮助实现多态:其实就是父类去管理子类。那他俩有啥区别呢?其实,接口就是协议,一般没有实现。而抽象类,可以有抽象方法,是让子类重写的,同时可以提供模板。比如:interface IBuildPlayerData{ Data build();} abstract AbstractBuildXXXData implementIBuildPlayerData{ ...原创 2021-06-27 10:09:31 · 234 阅读 · 0 评论 -
【惯用法:策略模式】 interface+abstract+多个实现子类+enum枚举所有子类
package org.example;import java.util.HashMap;import java.util.Map;/** * @author jianan * @date 2021/6/9 14:47:15 */enum Type { A(1), BBB(2), CCC(3), ABC(4), ; private int num; Type(int num) { this.num = num;.原创 2021-06-09 14:58:15 · 210 阅读 · 0 评论