我正在设计一个使用名为Rights的类的应用程序。此类包含有关用户可以/不可以执行的操作的信息,还包含其他类(如DocumentFilters)。
这里的问题是我有很多应用程序的不同部分通过构造函数或get方法获取该类的实例,以便能够在允许之前验证用户操作。这似乎是不好的做法(我可能错了)。有办法改善这个吗?
它的工作方式是让应用程序的主类创建Rights类,然后创建不同的组件并将其传递给它们。组件没有主类ether的实例。
示例代码。这在几个模块上重复。
public class ModuleA{
private Rights rights;
public ModuleA(Rights rights){
this.rights=rights;
}
private boolean verifyRights(ActionEvent e){
if(e.getSource("copyButton"){
if(rights.allowedToCopy){
return true;
}
return false;
}
}
答案 0 :(得分:0)
这是一个有效的设计,它被称为Inversion of control,更具体地称为Dependency Injection。如果您不想手动注入依赖项,可以尝试将IoC容器用于java。
也可以使用AOP将安全代码分成各个方面。这是一个更高级的选项,但这样做可以将检查安全性的代码与实际业务代码分开。
如果您显示的方法完全在Module类中重复,则应将该方法提取到基类中。然后,此基类应用于所有Module类。
public class ModuleBase
{
private Rights rights;
public ModuleA(Rights rights)
{
this.rights=rights;
}
public boolean verifyRights(ActionEvent e)
{
/// implementation
}
}
public class ModuleA : extends Bicycle
{
public ModuleA(Rights rights)
{
super(rights);
}
}
答案 1 :(得分:0)
首先,我建议将所有权限检查代码隔离到一些特殊层。通常,Facade模式在这里很有用 - 它可以检查权限,然后将请求转发给基础业务逻辑。
但这并不总是可行的。在这种情况下,您仍然必须提供带有对Rights实例的引用的类。这里有几种模式:
希望这有帮助。