首页 > 解决方案 > 构建规则引擎

问题描述

我目前正在尝试创建自己的规则引擎,我的意思是这是一个带有 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:在上面的示例中,您会看到PlayerConditionExecutorand ConditionExecutor,它们在这里,但我认为它们是错误的:

public interface PlayerConditionExecutor extends ConditionExecutor {
    <T> boolean execute(Player p, T ...args);
}
public interface ConditionExecutor<T> {
    <A> boolean execute(T target, A ...args);
}

标签: javaoopdesign-patterns

解决方案


推荐阅读