设计阶段 - 许多对同一对象的引用

时间:2011-12-16 09:05:34

标签: java

我正在设计一个使用名为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;
    }
}

2 个答案:

答案 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实例的引用的类。这里有几种模式:

  • 将它传递给构造函数/方法(就像你一样) - 仍然有效。
  • 介绍将存储Rights实例并使其可用于必要类的Context。但是当它存储许多可重用的实例时,上下文确实很有用,而不仅仅是一个。
  • 使用任何依赖注入框架。

希望这有帮助。