关于java:Struts基于继承的动作和组合

Struts Actions and Composition over inheritance

当我要应用dry原则时,即为了统一不同用例(例如,管理员角色和操作员角色)的多个struts操作的代码,一个选项是对该操作使用抽象的基类"base action",然后使用"adminaction extends baseaction"和"operatoraction extends baseaction"。我将为抽象NewBaseAction、UpdateBaseAction、DeleteBaseAction和ListBaseAction应用继承。

但是有一个原则说"喜欢组合胜过继承"(http://www.artima.com/lejava/articles/designprinciples4.html)。有没有一种方法可以通过使用接口以干净的方式实现这一点?


"有利于组合而非继承"的解决方案是:

  • 将共享代码移动到所有相关Action使用的单独的非Action类中,或者
  • 将不同的代码移动到一个单独的、非Action类中,并有一个可以使用这些行为的Action
  • 我做Struts已经有好几年了,但是我认为(2)在struts-config.xml中需要一些技巧,用不同的参数配置同一个Action类的几个,让Action能够根据参数加载或选择不同的行为实现。这看起来有点不具结构性,因为它需要一些控制逻辑,这些逻辑通常就在struts-config.xml中,并隐藏在代码中。

    但这取决于你的发展文化,这可能是一件好事。

    组合方法是否值得做,可能取决于您需要共享什么代码,以及尝试将代码与Struts样板文件分离是否有意义。

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


    声明"赞成组合而不是继承",这是总体上更好设计的线索。像Struts这样的框架引入了自己的编程模型。所以您应该按照Struts最佳实践的方式编写Struts操作。

    在您的案例中,编写基类也不错。问题是如何设计操作类层次结构,例如,考虑将部分功能的DispatchAction用作基本操作类。这样可以避免创建大量不必要的类。

    找到Dry原理的"struts-way"用例。更多Struts最佳实践,您可以在免费书Struts生存指南中找到。


    作为旁注:

    考虑到"new"和"update"通常是非常非常类似的操作,并且通常可以是相同的操作,例如,使用一个case语句,而不是支持两个不同JSP的两个不同类。