在不违反基本OOP规则的情况下添加新功能

时间:2012-11-12 15:55:49

标签: java oop design-patterns

我有一种情况需要扩展某些行为,而我仍然坚持如何正确设计它。 用户可以看到所有报告的列表。报告现在是简单的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正确实现这一要求?并非每个报告都应该关注权限,并且报告可以包含允许的空行动列表(这意味着任何人都无法访问操作。这并不意味着允许所有操作。)

2 个答案:

答案 0 :(得分:1)

对于这些操作,您可以调整“Chain of Responsibility”设计模式。

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

答案 1 :(得分:0)

我不确定详细信息,但我会选择一个抽象类Report并使用一个抽象方法getActions(User user)并使该方法抛出UserAccessException或类似的东西这一点。

abstract class Report {

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

}