0

我有一种情况,我需要扩展某些行为,但我不知道如何正确设计它。用户可以查看所有报告的列表。报告现在是简单的 POJO

class Report {
  ...
}

有一组可以在给定报告上调用的操作。现在有一个要求,对于某些报告,他们应该定义允许的操作。例如,您可以在 ReportOne 上运行“ActionA”和“ActionB”,在 ReportTwo 上只运行“ActionB”,在 ReportThree 上运行所有动作(如现在一样)。报告的可见性也受到限制,因此如果没有足够的权限,某些用户将无法查看给定的报告。

我正在考虑创建报告的子类,如下所示:

class ReportWithCustomActionsAllowed extends Report {
  private Set<Action> allowedActions;
  public Set<Actions> getAllowedActions() {
    return actions;
  }
  ....
}

class ReportWithPermission extends Report {
  ...
  private String permissionName = "ReportA.VIEW";
  public boolean canShowTo(User user) {
    return user.hasPermission(permissionName);
  }
}

我在这里看错了两件事:

1) 如果不创建另一个类,就不可能创建允许自定义操作的受限报告

2)让Set<Report>我不能在不破解它的情况下限制行动/报告,instanceof这显然是错误的。

我怎样才能在正确完成 OOP 的情况下实现这一要求?并非每个报告都应该关心权限,并且报告可以包含允许的空操作列表(这意味着任何人都无法访问操作。这并不意味着允许所有操作)。

4

2 回答 2

1

对于这些操作,您可能会采用“责任链”设计模式。

对于访问权限,通常的方法不是让报告关心权限,而是让报告关心权限,而是有一个外部安全管理器,它维护一个允许谁做什么的列表,并且当调用一个操作时,检查角色是否正在调用该操作是允许的。这实际上是一件相当复杂的事情,因此如果您想要更好的建议,您可能希望更准确地指定您的安全要求有多广泛。

于 2012-11-12T16:30:22.490 回答
0

我不确定全部细节,但我会选择一个抽象类Report并拥有一个抽象方法getActions(User user)并让该方法抛出一个UserAccessException或类似的东西。

abstract class Report {

abstract public Set<Action> getActions(User user) throws UserAccessException;

}
于 2012-11-12T16:05:51.227 回答