【问题标题】:Struts Actions and Composition over inheritanceStruts 动作和组合优于继承
【发布时间】:2010-12-02 22:34:39
【问题描述】:
当我想应用 DRY 原则,即为不同的用例(例如管理员角色和操作员角色)统一多个 Struts 动作的代码时,一种选择是使用抽象基类“BaseAction” ” 用于操作,然后使用“AdminAction extends BaseAction”和“OperatorAction extends BaseAction”。我会为抽象的 NewBaseAction、UpdateBaseAction、DeleteBaseAction、ListBaseAction 应用继承。
但是有一个原则是“优先组合胜于继承”(http://www.artima.com/lejava/articles/designprinciples4.html)。有没有办法通过使用接口以干净的方式实现这一点?
【问题讨论】:
标签:
java
design-patterns
oop
struts
【解决方案1】:
声明“优先组合而不是继承”它是总体上更好设计的线索。像 Struts 这样的框架引入了自己的编程模型。因此,您应该以遵循 Struts 最佳实践的方式编写 Struts 操作。
在您的情况下,编写基类还不错。问题是如何设计动作类层次结构,例如考虑将DispatchAction 用作基本操作类的部分功能。它将使您免于创建许多不必要的类。
查找 DRY 原则的“Struts way”用例。更多 Struts 最佳实践可以在免费书籍 Struts Survival Guide
中找到
【解决方案2】:
“优先组合优于继承”的解决方案是:
- 将共享代码移动到一个单独的非
Action 类中,供所有相关Actions 使用,或者
- 将不同代码移动到一个单独的非
Action 类中,并拥有一个可以使用任何这些行为的Action。
我做 Struts 已经有几年了,但我认为对于 (2) 你需要在 struts-config.xml 中使用一些技巧,配置相同 Action 类的多个 <action>s,具有不同的参数,并让Action 能够根据参数加载或选择不同的行为实现。这似乎有点非 Strutsy,因为它需要一些通常在 struts-config.xml 中的控制逻辑并将其隐藏在代码中。
但取决于您的开发文化,这实际上可能被认为是一件好事。
组合方法是否值得做可能取决于您需要共享哪些代码,以及尝试将该代码与 Struts 样板文件隔离是否有意义。
我使用的最后一个 Struts 应用程序,我们使用了继承。可能是正确的做法,可能是我们只是不知道更好。
【解决方案3】:
附注:
考虑到“new”和“update”通常是非常非常相似的操作,并且通常可以是同一个 Action,只有一个 case 语句,而不是支持两个不同 JSP 的两个不同类。