事件观察者的替代方案

时间:2013-09-20 11:48:42

标签: java events design-patterns observer-pattern

我正在构建一个使用事件观察器模式的应用程序,以允许希望添加自己的功能的第三方供应商轻松扩展系统中的点。

这很好用,但它依赖于一件事:

  • 我必须决定系统供应商中哪些点可能希望扩展系统并在流程中的特定点触发事件。

供应商可能希望扩展我未触发事件的系统的不同部分,这是完全合理的。

这里有哪些替代方案,允许供应商从他们选择的系统中的任何一点扩展系统 - 或尽可能接近该目标 - 使用类似于事件观察者的东西,即可以简单地挂钩到系统中选择?

2 个答案:

答案 0 :(得分:0)

好的,所以你需要做两件事。首先是走出去找一些真正的客户,并与他们交谈。他们在哪里需要扩展?他们比你知道的要好得多。第二件事是在不提供挂钩的情况下犯错误。你可以随时添加它们,但是你必须支持你发布的任何内容,即使它没有被使用。

正如@Holger所说,没有办法为系统中的任何一点提供任意钩子,而且你真的不希望这样做。这是一场维护噩梦。

答案 1 :(得分:0)

霍尔格已经提到AOP可以帮助你。您只需使用自定义注释注释代码,并让客户定义自己的方面(他们将需要重新编译整个代码库)。例如:

@Data
public class Records {
  @Saving
  public void add(Record rec) {
    // your code
  }
} 

稍后,您的客户可能会说“我希望每次有人保存某些数据时都会触发”。他将不得不用这个自定义的“快捷方式”(伪代码)来定义自己的“方面”:

@Aspect
public class OnSaving {
  @Before("execution(* @Data @Saving(..))")
  public void shortcut(JoinPoint pnt) {
    // your customer's code
  }
}

您的源代码不会被更改,只需重新编译即可。我假设使用AspectJ