条件系统学习笔记


概况

条件系统是为了方便于各个系统进行条件判断的,在条件复杂的情况下很好用。


配置资源

  1. 配置文件: resource/ConditionResource.xlsx

领域模型与接口

所有具体的条件实现类都实现了ICondition<Obj>接口或者继承了实现了该接口的基类。

条件接口

public interface ICondition<Obj> {

    // 获取条件
    ConditionType getType();

    // 带有resource参数的init方法。方便以后子拓展新的字段
    void init(ConditionResource resource);

    // 验证条件是否满足
    Result verify(Obj obj, int amount, Map<object, Object> param)

}

玩家条件基类 BasePubCondition

    public abstract class BasePubCondition implements ICondition<Object> {
        @Verride
        public final Result verify(Object t, int amount, Map<Object,Objct> param) {
            return verify(amount, param);
        }
    }
    // 验证条件是否满足
    public abstract Result verify(int amount, Map<Object, Object>);

公共条件组 PubConditions

  • Result verify(int amount, Map<Object, Object> param) 验证条件是否满足,所有条件
  • void verifyOrFailException(int amount, Map<object, Object>) param 验证条件,如果验证失败,则抛出异常
  • boolean verifyOr(int amount, Map<Object, Object>) param 验证条件是否满足,只要有一个条件满足,就算成功

条件类型定义 ConditionType


public enum ConditionType {
    // 必然失败条件
    FAIL(FailCondition.class),
    //开服天数
    OPEN_DAY(OpenDayCondition.class),
    //开关类条件
    ON_OFF(ONOffCondition.class),
    //开关类条件
    ITEM_RANGE(TimeRangeCodition.class),
    //日期条件
    DAY_RANGE(DayRangeCondition.class),
...

    private Class<? extends ICondition<?>> conditionClass;
    // 构造方法
    ConditionType(Class<? extends ICondition<?> conditionClass) {
        this.conditionClass = conditionClass;
    }

    // 创建一个没有初始化的条件
    public <T extends ICondition> T create() {
        try {
            return (T) conditionClass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);        }
    }

    // 根据配置创建条件
    public <T extends ICondition> T create(ConditionResource resouece) {
        T condition = create();
        condition.init(resource);
        retrun condition;
    }

}


  • <T extends ICondition> T created() 创建一个没有初始化的条件
  • T extends ICondition> T create(ConditionResource resource) 根据配置创建条

验证结果 Result

每一个result都具有唯一性,不可变性


条件管理 ConditionManager

  • <Obj> Conditions<Obj> create(ConditionResource resource) 创建单个条件的组,如果传入的条件组为null,返回一个无条件的空
  • <Obj> Condition<Obj> create(List<ConditionResource> resources, boolean isDefaultSuccess) 创建多个条件的组,如果传入的条件组为null,返回一个无条件的空。
  • <Obj> ConditionOrAnd createOrAnd(ConditionOrAndResource orAndResource) 创建支持与(&&)或(||)检测的条件组

条件系统的使用

  1. 创建ICondition<Obj>实现类
    编写ICondition<Obj>的实现类,重写验证条件的方法。

         ConditionType getType();
    
         void init(ConditionResource resource);
    
         Result verify(Obj objm int amount, Map<Object, Object> param);
    
    
  2. 编写ConditionType枚举类

    通过构造参数绑定条件相关的ICondition<Obj>实现类。

     // 玩家等级条件枚举
     PLAYER_LEVLE(PlayerLevelCondition.class)
    
    
  3. excel配置条件
    excel配置条件会转化ConditionResource对象。可以在某模块的配置中以json格式的方式配置条件。

    json配置格式在Excel中的例子:[{key:1, type:"PLAYER_LEVLE"}]
    在配置类中:

         private List<ConditionResource> useConditions;
         private transient Conditions<Player> useCondition;
    

    ConditionResource.xlsx配置的条件通过ConditionManager使用(目前还没有提供使用方法)

    ConditionResource.xlsx中配置

         @Static
         private Storage<String,ConditionResource> conditionResource;
    
  4. 使用检验

     // createConditions方法传入的是一个List<ConditionResource>,需要配置在xlxs文件中。根据ConditionType调用create方法创建一个AbstractCondition实现类。
    
     Conditions conditions  = Conditions.valueOf(channelResource.getSendConditions());
    
     // 调用conditions的verify方法逐个AbstractCondition实现类的verify
     Result result = conditions.verify(player,1);
     if(!result.isSuccess()) {
         throw ManagedException.valueOf(result.getCode())
     }