条件系统学习笔记
概况
条件系统是为了方便于各个系统进行条件判断的,在条件复杂的情况下很好用。
配置资源
- 配置文件: 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) 创建支持与(&&)或(||)检测的条件组
条件系统的使用
创建
ICondition<Obj>
实现类
编写ICondition<Obj>
的实现类,重写验证条件的方法。ConditionType getType(); void init(ConditionResource resource); Result verify(Obj objm int amount, Map<Object, Object> param);
编写
ConditionType
枚举类通过构造参数绑定条件相关的
ICondition<Obj>
实现类。// 玩家等级条件枚举 PLAYER_LEVLE(PlayerLevelCondition.class)
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;
使用检验
// 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()) }