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