Struts动作和组合优于继承

时间:2009-10-01 09:35:37

标签: java design-patterns oop struts

当我想应用DRY原则,即为不同的用例(例如管理员角色和操作员角色)统一多个Struts操作的代码时,一个选项是使用抽象基类“BaseAction” “对于动作然后使用”AdminAction扩展BaseAction“和”OperatorAction扩展BaseAction“。我将为一个抽象的NewBaseAction,UpdateBaseAction,DeleteBaseAction,ListBaseAction应用继承。

但是有一个原则是“赞成作文而不是继承”(http://www.artima.com/lejava/articles/designprinciples4.html)。有没有办法通过使用接口以干净的方式实现它?

3 个答案:

答案 0 :(得分:2)

声明“赞成合成而非继承”这是一般的更好设计的线索。像Struts这样的框架引入了自己的编程模型。因此,您应该以符​​合Struts最佳实践的方式编写Struts操作。

在你的情况下写基类也不错。问题是如何设计动作类层次结构,例如考虑使用DispatchAction将部分功能作为基本操作类。它可以帮助您避免创建大量不必要的类。

查找“Struts方式”用例DRY原理。您可以在免费书籍Struts Survival Guide

中找到更多Struts最佳实践

答案 1 :(得分:2)

“赞成组合而不是继承”的解决方案是:

  1. 将共享代码移动到所有Action所使用的单独的非Action类中,或
  2. 不同的代码移动到单独的非Action类中,并且只有一个Action可以使用这些行为。
  3. 我做Struts已经有几年了,但我认为(2)你需要struts-config.xml中的一点点诡计,配置相同<action>的几个Action } class,具有不同的参数,并且Action能够根据参数加载或选择不同的行为实现。这似乎有点非Strutsy,因为它需要一些通常在struts-config.xml中的控制逻辑并将其隐藏在代码中。

    但是根据你的发展文化,这实际上可能被视为一件好事。

    组合方法是否值得做可能取决于您需要共享的代码,以及尝试从Struts样板中隔离该代码是否有意义。

    我上次使用的最后一个Struts应用程序,我们使用了继承。可能是正确的事情,可能是我们只是不知道更好。

答案 2 :(得分:0)

作为旁注:

考虑“new”和“update”通常是非常非常相似的操作,并且通常可以是相同的Action,只有一个case语句,而不是两个不同的类支持两个不同的JSP,例如。