我遇到的情况是我需要扩展某些行为,而我坚持正确地设计行为。
用户可以看到所有报告的列表。报表目前是简单的POJO

class Report {
  ...
}


有一组可在给定报告上调用的操作。现在,对于某些报告,要求它们应定义允许的操作。例如。您可以在ReportOne上运行“ ActionA”和“ ActionB”,在ReportTwo上仅运行“ ActionB”,在ReportThree上运行所有操作(按现在)。此外,报告的可见性受到限制,因此,如果没有足够的权限,则某些用户将看不到给定的报告。

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

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才能实现此要求?并非每个报告都应该关心权限,并且报告可以包含允许的操作的空列表(这意味着任何人都不可以执行操作。这并不意味着所有操作都被允许)。

最佳答案

对于这些动作,您可能可以采用“ Chain of Responsibility”设计模式。

对于访问权限,通常的方法不是让报告关心权限,而是拥有外部安全管理器,该安全管理器维护允许执行操作的人员的列表,并在调用操作时检查角色是否符合要求。允许执行该操作。这实际上是一件非常复杂的事情,因此,如果您需要更好的建议,则可能需要更精确地指定安全要求的范围。

关于java - 在不违反基本OOP规则的情况下添加新功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13346955/

10-12 07:04