java - 构建规则引擎
问题描述
我目前正在尝试创建自己的规则引擎,我的意思是这是一个带有 GUI 的系统,用户可以在其中创建具有不同设置的条件来执行某些任务。我不确定结构,所以我在这里请求一些帮助。
首先有条件目标,这是为了区分我们应该从哪里获取原始数据。由于这是一个游戏环境,我可以拥有:
- 播放器
- 实体
- 服务器
- ...
这些稍后将用于创建“检查Player
- has been connected this week
”等条件
知道了这一点,我想我应该有某种可以持有目标的interface
名字?ConditionExecutor
每个条件还应该有一个执行方法,该方法将被调用以检查条件是否满足,这就是让我感到困惑的地方。
假设我有一个接口ConditionExecutor
,我想我还需要一个PlayerConditionExecutor
与玩家相关的所有执行器,但这些只是接口(我认为它们应该是)。
然后我会有处理每个条件的实际类。例如:
public class PlayerOnlineExecutor implements PlayerConditionExecutor {
private ConditionExecutionType conditionExecutionType = ConditionExecutionType.PLAYER_ONLINE_STATUS;
public boolean execute(Player player) {
return player.isOnline();
}
}
然后该执行者将在某处注册,但我仍然对如何构建它感到困惑。上面显示的条件相当简单,但可能需要像这样的额外数据:
public class PlayerHoursPlayedExecutor implements PlayerConditionExecutor {
private ConditionExecutionType conditionExecutionType = ConditionExecutionType.PLAYER_PLAYED_TIME;
public boolean execute(Player player, int hoursThreshold) {
return player.getTotalTimePlayed() >= hoursThreshold;
}
}
如您所见,这里我们需要额外的数据,但这可能是任何数据。这种情况需要一个额外的整数,但它可能需要一些其他数据。我觉得这对于接口是不可能的,但也许我错过了一些东西。
我最终会有一个管理器ConditionsManager
,它将根据条件类型检索所有条件(参见上面的示例)并执行每个条件。问题是每个条件可能需要不同的目标(玩家、实体、服务器……),并且可能需要一堆不同的元数据。
如果有人能给我带来好的方向,或者向我展示某些可能在这里有用的设计模式,那就太棒了。
PS:在上面的示例中,您会看到PlayerConditionExecutor
and ConditionExecutor
,它们在这里,但我认为它们是错误的:
public interface PlayerConditionExecutor extends ConditionExecutor {
<T> boolean execute(Player p, T ...args);
}
public interface ConditionExecutor<T> {
<A> boolean execute(T target, A ...args);
}
解决方案
推荐阅读
- c++ - 如何从 MATLAB Lab 色标转换为 OpenCV Lab 色标?
- c# - 在与 WebApplicationFactory 的集成测试中覆盖数据库提供程序
- android - 在片段之间导航时,Android App 中的图形内存无限增加
- java - 如何在 IntelliJ 中调试 Web 服务?
- python - 随机数数据可视化逻辑的问题
- python - 使用 python 请求库选择并提交表单
- c# - 使用 for 循环允许用户输入 1-100 的输入
- go - hex.EncodeToString 的 Golang 复杂形式参数
- c - 套接字如何处理本地地址更改?
- r - 当列由于用户选择而改变位置时,在 Shiny 中取消选择 DT::formatRound 中的列