如何在Struts中使用Action子类作为Facade?

时间:2011-03-22 06:58:10

标签: design-patterns struts business-logic

另外,Business Delegate模式如何帮助我?

1 个答案:

答案 0 :(得分:1)

  

我一直在使用struts一段时间,并且通常将所有业务代码放在action类本身中。现在有人对我说这是一个不好的做法

是的。

  

我应该使用外观和业务委托模式。

我不知道,也许是,也许不,这取决于你的申请。让这个人详细说明他/她的意思。

在业务方面使用Facade为复杂系统(更复杂的对象,对象集,其他内部系统等)提供更简单的访问接口,从而隐藏该系统与系统客户端的复杂性和交互

在演示方面使用业务委托再次隐藏客户端调用的业务组件的复杂性(使用Service Locator管理业务组件的查找,管理网络调用,异常等)。

因此,基本上Facade和业务代表齐头并进,将客户与其使用的业务服务进行更松散的链接。

现在,如果你认为Struts是一个MVC类型的应用程序,我真的不知道Facade和Business Delegate是如何组合在一起的。这就是为什么你应该让这个人详细说明。

在Struts中你有:

  • 负责域逻辑的模型
  • 一个视图,负责向用户呈现模型的状态并允许与用户进行交互;
  • 一个控制器,它充当模型和视图之间的粘合剂,用于转换模型执行的操作中的用户请求,之后选择下一个视图以显示模型的新状态。

所有域逻辑都应该在模型中。 您的Action类不属于Model ,它是Controller的一部分。看那些HttpServletRequest and HttpServletResponse objects on the execute方法?这听起来像域逻辑相关的东西吗?不!

您没有将所有业务规则放在Action类中。在Action类中,您委托到处理域逻辑的类。这通常发生在Service Layer

服务层与DTO s(通常为POJO s)与外界通信,并不关心其呼叫者类型(HTTP Web应用程序,桌面应用程序等)。 Action类应该将HttpServletRequest参数转换为服务层所期望的正确类型,并为其提供完全控制。当MOdel返回时,它将结果发送到View。

这是一个很好的做法,因为现在可以重用您的服务层及其包含的域逻辑,它不再依赖于某些Web框架(即Struts)。

P.S。一句建议。不要将ActionForm对象用作服务层的DTO。人们认为ActionForms属于Model,但事实并非如此。 ActionForms是Struts的黑羊,它们不是POJO,而是与Struts松散耦合,因为你必须扩展一个struts ActionForm类来使它们工作,这意味着与框架紧密结合。