包装类而不重复Java中的所有方法

时间:2014-07-23 09:28:56

标签: java design-patterns aop spring-aop

我想编写一个Java类,以特定的方式为多租户系统包装另一个类:

  • 原始类的所有方法都应存在于新类
  • 除了新方法的参数应该相同减去1:租户(=当前用户)
  • 我想为新类编写尽可能少的代码。在最好的情况下,它应该是空的并且具有所有方法"自动生成"或"自动检测"在运行时。

示例:

拿这个现有的课程:

MyService{
   public List<Product> getProducts(Account filterWithUseraccount);
   public List<Purchase> getPurchases(Account filterWithUseraccount, Date fromDate, Date tillDate);
   public List<Category> getCategories(Account filterWithUseraccount, Category parentCategory);
}

我想创建这个新类,但方法应该是&#34;自动生成&#34;:

MyTenantOrientedService{

   // Assign an account which will be used to call all MyService methods
   private Account filterWithUseraccount;

   // The service being wrapped
   private MyService myService;

   public List<Product> getProducts(){
      return myService.getProducts(filterWithUseraccount);
   }
   public List<Purchase> getPurchases(Date fromDate, Date tillDate){
      return myService.getPurchases(filterWithUseraccount, fromDate, tillDate);
   }
   public List<Category> getCategories(Category parentCategory){
      return myService.getCategories(filterWithUseraccount, parentCategory);
   }
}

正如您所看到的,MyTenantOrientedService中的方法与MyService中的方法相同,只是参数&#34; Account filterWithUseraccount&#34;永远不会使用,可以从私有财产中获取。

这是一个简单的例子,但想象一个有很多方法的类,这使得创建包装函数变得非常繁琐。这是很多代码重复,很容易创建bug。

我相信使用AOP或其他设计模式可能存在解决方案,但我无法弄清楚哪个。

1 个答案:

答案 0 :(得分:2)

您的IDE会为您处理此类任务。

例如,您可以在 MyTenantOrientedService 中添加 MyService 类型的成员变量,然后在Eclipse上右键单击MyTenantOrientedService,然后单击&#34; Source - &GT;生成委托方法&#34;

它正在为您应用Delegation Pattern