Mike Liu c5a4068e84
docs: Translation for zh (#1805)
* add state and callback pattern

* add command and template-method pattern

* add iterator pattern

* add bridege and DI pattern

* fix issue #1600

* add converter,proxy,visitor pattern

* add caching,composite,delegation,dirty-flag,interpreter patterns

* add dao and producer-consumer

* add dto and provate class data pattern

* fix #1646 png path problems

* fix #1646 composite png path case problem

* add abstract document pattern and version-number pattern

* add ambassador pattern

* add acyclic-visitor and api-gateway pattern

* add abstract-factory pattern

* add active-object pattern

* add aggregator-microservices and arrange-act-assert pattern

* update async-method-invocation pattern

* add balking and business-delegate pattern

* add bytecode and circuit-break pattern

* update arrange/act/assert pattern problems

* add csch pattern

* add language code, correct pic path

* #1805 update permalink

Co-authored-by: Subhrodip Mohanta <subhrodipmohanta@gmail.com>
Co-authored-by: Mike <admin@xiaod.info>
Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
2021-08-01 20:25:54 +05:30
..
2021-08-01 20:25:54 +05:30

layout, title, folder, permalink, categories, language, tags
layout title folder permalink categories language tags
pattern Data Transfer Object data-transfer-object /patterns/data-transfer-object/ Architectural zh
Performance

目的

次将具有多个属性的数据从客户端传递到服务器,以避免多次调用远程服务器。

解释

真实世界例子

我们需要从远程数据库中获取有关客户的信息。 我们不使用一次查询一个属性而是使用DTO一次传送所有相关属性。

通俗的说

使用DTO可以通过单个后端查询获取相关信息。

维基百科说

在编程领域数据传输对象DTO是在进程之间承载数据的对象。 使用它的动机是通常依靠远程接口例如Web服务来完成进程之间的通信在这种情况下每个调用都是昂贵的操作。

因为每个方法调用的大部分成本与客户端和服务器之间的往返时间有关所以减少调用数量的一种方法是使用一个对象DTO来聚合将要在多次调用间传输的数据但仅由一个调用提供。

程序示例

让我们来介绍我们简单的CustomerDTO

public class CustomerDto {
  private final String id;
  private final String firstName;
  private final String lastName;

  public CustomerDto(String id, String firstName, String lastName) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public String getId() {
    return id;
  }

  public String getFirstName() {
    return firstName;
  }

  public String getLastName() {
    return lastName;
  }
}

CustomerResource 类充当客户信息的服务器。

public class CustomerResource {
  private final List<CustomerDto> customers;

  public CustomerResource(List<CustomerDto> customers) {
    this.customers = customers;
  }

  public List<CustomerDto> getAllCustomers() {
    return customers;
  }

  public void save(CustomerDto customer) {
    customers.add(customer);
  }

  public void delete(String customerId) {
    customers.removeIf(customer -> customer.getId().equals(customerId));
  }
}

现在拉取客户信息变得简单自从我们有了DTOs。

    var allCustomers = customerResource.getAllCustomers();
    allCustomers.forEach(customer -> LOGGER.info(customer.getFirstName()));
    // Kelly
    // Alfonso

类图

alt text

适用性

使用数据传输对象模式当

  • 客户端请求多种信息。信息都是相关的
  • 当你想提高获取资源的性能
  • 你想降低远程方法调用的次数

鸣谢