类 RangeBroadcast

java.lang.Object
com.iohao.game.action.skeleton.kit.RangeBroadcast
所有已实现的接口:
RangeBroadcaster

public class RangeBroadcast extends Object implements RangeBroadcaster
范围内的广播,这个范围指的是,指定某些用户进行广播。
     在执行广播前,开发者可以自定义业务逻辑,如
     - 添加一些需要广播的用户
     - 删除一些不需要接收广播的用户
     - 可通过重写 logic、trick 方法来做一些额外扩展
 
for example

         // example - 1
         new RangeBroadcast(flowContext)
                 // 需要广播的数据
                 .setResponseMessage(responseMessage)
                 // 添加需要接收广播的用户
                 .addUserId(1)
                 .addUserId(2)
                 .addUserId(List.of(3L, 4L, 5L))
                 // 排除一些用户,被排除的用户将不会接收到广播
                 .removeUserId(1)
                 .removeUserId(4)
                 // 执行广播,只有 2、3、5 可以接收到广播
                 .execute();

         // example - 2
         new RangeBroadcast(flowContext)
                 // 需要广播的数据(路由、业务数据)
                 .setResponseMessage(cmdInfo, StringValue.of("hello"))
                 // 添加需要接收广播的用户
                 .addUserId(1)
                 // 执行广播
                 .execute();

         // example - 3
         BrokerClientContext brokerClient = ...;
         var aggregationContext = brokerClient.getCommunicationAggregationContext();
         new RangeBroadcast(aggregationContext)
                  // 需要广播的数据(路由、业务数据)
                 .setResponseMessage(cmdInfo, StringValue.of("hello"))
                 // 添加需要接收广播的用户
                 .addUserId(1)
                 // 执行广播
                 .execute();
 
 
此外,还支持协议碎片及 List。关于协议碎片可阅读 协议碎片 - 文档 for example

     // ------------ object ------------
     // 广播单个对象
     DemoBroadcastMessage message = new DemoBroadcastMessage();
     message.msg = "helloBroadcast --- 1";

     new RangeBroadcast(flowContext)
             .setResponseMessage(cmdInfo, message);

     List<DemoBroadcastMessage> messageList = List.of(message);
     new RangeBroadcast(flowContext)
             .setResponseMessageList(cmdInfo, messageList);

     // ------------ int ------------

     // 广播 int
     int intValue = 1;
     new RangeBroadcast(flowContext)
             .setResponseMessage(cmdInfo, intValue);

     // 广播 int list
     List<Integer> intValueList = List.of(1, 2);
     new RangeBroadcast(flowContext)
             .setResponseMessageIntList(cmdInfo, intValueList);

     // ------------ long ------------

     // 广播 long
     long longValue = 1L;
     new RangeBroadcast(flowContext)
             .setResponseMessage(cmdInfo, longValue);

     // 广播 long list
     List<Long> longValueList = List.of(1L, 2L);
     new RangeBroadcast(flowContext)
             .setResponseMessageLongList(cmdInfo, longValueList);

     // ------------ String ------------

     // 广播 String
     String stringValue = "1";
     new RangeBroadcast(flowContext)
             .setResponseMessage(cmdInfo, stringValue);

     // 广播 String list
     List<String> stringValueList = List.of("1L", "2L");
     new RangeBroadcast(flowContext)
             .setResponseMessageStringList(cmdInfo, stringValueList);

     // ------------ boolean ------------

     // 广播 boolean
     boolean boolValue = true;
     new RangeBroadcast(flowContext)
             .setResponseMessage(cmdInfo, boolValue);

     // 广播 boolean list
     List<Boolean> boolValueList = List.of(true, false);
     new RangeBroadcast(flowContext)
             .setResponseMessageBoolList(cmdInfo, boolValueList);
 
 }
 
从以下版本开始:
21.8
作者:
渔民小镇
日期:
2024-04-23
  • 构造器详细资料

    • RangeBroadcast

      public RangeBroadcast(CommunicationAggregationContext aggregationContext)
      create by CommunicationAggregationContext
      参数:
      aggregationContext - 网络通讯聚合接口
    • RangeBroadcast

      public RangeBroadcast(FlowContext flowContext)
      create by CommunicationAggregationContext
      参数:
      flowContext - flowContext CommunicationAggregationContext
  • 方法详细资料

    • enableEmptyUserCheck

      public RangeBroadcaster enableEmptyUserCheck()
      检测空用户,如果没有任何用户,广播(推送)时将触发异常
      返回:
      this
    • listUserId

      public Set<Long> listUserId()
      从接口复制的说明: RangeBroadcaster
      接收广播的用户
      指定者:
      listUserId 在接口中 RangeBroadcaster
      返回:
      接收广播的用户
    • setResponseMessage

      public RangeBroadcaster setResponseMessage(ResponseMessage responseMessage)
      设置响应的广播数据 ResponseMessage
      指定者:
      setResponseMessage 在接口中 RangeBroadcaster
      参数:
      responseMessage - ResponseMessage
      返回:
      this
    • execute

      public final void execute()
      响应消息到远程端(用户、玩家)
           模板方法模式:
               在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
               模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
      
               要点:
               - “模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类。
               - 模板方法模式为我们提供了一种代码复用的重要技巧。
               - 模板方法的抽象类可以定义具体方法、抽象方法和钩子。
               - 抽象方法由子类实现。
               - 钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
               - 为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
               - 好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用低层模块。
               - 你将在真实世界代码中看到模板方法模式的许多变体,不要期待它们全都是一眼就可以被你一眼认出的。
               - 策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
               - 工厂方法是模板方法的一种特殊版本。
       
      指定者:
      execute 在接口中 RangeBroadcaster
    • logic

      protected void logic()
      在将数据推送到调用方之前,触发的方法
           可以做一些逻辑,在逻辑中可以决定是否执行推送
           
               // 不执行推送数据的操作
               this.disableSend()
           
       
    • trick

      protected void trick()
      小把戏 (钩子方法),子类可以做些其他的事情;执行广播(推送)之前,触发的方法。
    • broadcast

      protected void broadcast()
      广播数据
    • disableSend

      protected void disableSend()
      不执行推送数据的操作