java中的类变量与传递参数 - 设计问题

时间:2014-03-07 13:07:23

标签: java oop

假设我在SOA模型应用程序中有两个类..

  1. 服务类 - 接收请求并返回响应
  2. 为了进一步处理(比如业务逻辑/解析/ dao等),它将请求传递给SvcBusiness类。
  3. 问题是,如果SvcBusiness类使用请求作为其类变量,还是应该只使用其中一个业务方法中的请求?可能需要将请求传递给DAO层等其他较低层。这些类是否也将请求用作类变量,或者请求是否只是方法的一部分?

    ServiceImpl类:

    public class ServiceImpl {
    
       public Response getDataForType1Request(Request type1) {
          SvcBusiness buzclazz = new SvcBusiness();
          return buzclazz.doOperationForType1(type1);
       }
    
       public Response getDataForType2Request(Request type2) {
          SvcBusiness buzclazz = new SvcBusiness();
          return buzclazz.doOperationForType2(type2);
       }
    
    }
    

    选项1:当请求作为参数传递时。

    public class SvcBusiness {
    
       public Response doOperationForType1(Request type1) {
          // do business and return response1
       }
    
       public Response doOperationForType2(Request type2) {
          // do business and return response2
       }
    
    }
    

    选项2:将请求设置为类变量。在这种情况下... ServiceImpl将在创建对象时将请求传递给SvcBusiness构造函数..并且只需调用execute()方法。

    public class SvcBusiness {
    
       private Request request;
    
       public SvcBusiness(Request request) {
          this.request = request;
       }
    
       private Response doOperationForType1() {
          // do business and return response1
       }
    
       private Response doOperationForType2() {
          // do business and return response2
       }
    
       public Response execute() {
          // if type1 request call doOperationForType1()
          // if type2 request call doOperationForType1()
       }
    
    }
    

    请帮忙!两者的优点和缺点是什么?是否有设计模式来解决这种情况?

3 个答案:

答案 0 :(得分:2)

不要在类层次结构中进一步使用请求(和响应)!服务(以及服务调用的所有内容)可以从其他地方调用,其中不存在请求。然后你会遇到填充该参数的问题。在服务中使用自己的数据模型,并从请求中提取和转换所需的所有内容。

答案 1 :(得分:0)

完全同意Uwe的回答。但是,如果您仍然想要使用Request类,那么它作为参数(Servlets的工作方式)的危害就会小一些。否则,您必须在极有可能的多线程环境中处理同步。

答案 2 :(得分:0)

当我遇到这样的问题时,我总是想知道我是否真的需要一个物体。通常我使用选项1,但创建所有方法static。由于这些方法不依赖于当前对象状态(没有实例属性),因此我保存了一些内存而不是创建这样的对象(其他选项只是实现了Singleton模式)。

public class SvcBusiness {

   public static Response doOperationForType1(Request type1) {
      // do business and return response1
   }

   public Response doOperationForType2(Request type2) {
      // do business and return response2
   }

}