Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC实施/最佳实践问题_Model View Controller_Design Patterns - Fatal编程技术网

Model view controller MVC实施/最佳实践问题

Model view controller MVC实施/最佳实践问题,model-view-controller,design-patterns,Model View Controller,Design Patterns,我必须使用一些不是真正的MVC的代码(例如,它不使用显式框架)。现在,我们使用servlet将数据传递给服务 这是我的问题。我收到一个servlet的帖子,其中包含一大堆我必须保存到数据库中的地址数据。数据(显然)在HttpServletRequest对象中。我的问题是,如何将这些数据传递到服务中?我不愿意这样做: AddressService.saveAddress(request); String addressLine = request.getParameter("addressLin

我必须使用一些不是真正的MVC的代码(例如,它不使用显式框架)。现在,我们使用servlet将数据传递给服务

这是我的问题。我收到一个servlet的帖子,其中包含一大堆我必须保存到数据库中的地址数据。数据(显然)在
HttpServletRequest
对象中。我的问题是,如何将这些数据传递到服务中?我不愿意这样做:

AddressService.saveAddress(request);
String addressLine = request.getParameter("addressLine");
..
.. about 7 other parameters
..
String zip = request.getParameter("zip");

AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip);
因为我认为服务不应该依赖于请求。我的另一个选择是这样做:

AddressService.saveAddress(request);
String addressLine = request.getParameter("addressLine");
..
.. about 7 other parameters
..
String zip = request.getParameter("zip");

AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip);

但是我也不喜欢有大量参数的函数。我正在考虑创建一个名为
AddressData
的中间对象,该对象将保存来自请求的数据,然后将其传递到服务中。这是一种可以接受的做事方式吗?

是的,这是一种消除这种依赖性的已知方式。我一时想不起确切的来源,但有几本书包括了这项技术


这种方法的一种变体是使
AddressData
成为一个包装器,它本身没有复制和保存所有需要的请求数据,只保留对它的私有引用,并将所有调用转发给它。这可能更灵活、更干净,尤其是在有许多请求参数和/或参数经常更改/引入新参数的情况下。

是的,这是一个有效的解决方案,称为。

使用接口来解耦:

型号:

public interface Address {
    String getLine1();
    String getLine2();
    ...
    String getZip();
}
public class AddressBase implements Address {
    public AddressBase(String line1, String line2, ..., String zip) {
       ...
    }
    ...
}
public class AddressService {
    void saveAddress(Address address);
}
现在控制器具有选项,并且模型受到控制器实现的保护:

控制器选项1:

// wrap - lazy interrogator
class AddressRequestWrapper implements Address {
    ...
    AddressRequestWrapper(HttpRequest request) {
        this.request = request;
    }
    String getLine1() {   return request.get(LINE_1_FIELD_ID); }
    ...
}
控制器选项2:

// "wrap" - eager interrogator
class AddressRequestWrapper extends AddressBase {
    AddressRequestWrapper(HttpRequest request) {
        super(
            request.get(LINE_1_FIELD_ID),
            request.get(LINE_2_FIELD_ID),
            ...
            request.get(ZIP_FIELD_ID)
        );
  }
  ...
}
控制器选项3:

// Just use AddressBase directly
Address address =
    new AddressBase(
            request.get(LINE_1_FIELD_ID),
            request.get(LINE_2_FIELD_ID),
            ...
            request.get(ZIP_FIELD_ID)
    );
AddressService.saveAddress(address);