В этом рассказе я рассмотрю концепцию шаблонов распределения, объекта передачи данных и удаленного фасада.

Объект передачи данных

Я почти уверен, что вы уже слышали о DTO (также называемых объектами значений) и создали хотя бы один класс DTO за свою карьеру разработчика программного обеспечения.

Когда вы работаете с удаленным интерфейсом (например, с веб-сервисами), каждый вызов к нему стоит дорого. В результате вам нужно уменьшить количество вызовов, а это означает, что вы должны использовать DTO, который агрегирует данные для передачи большего количества данных с каждым вызовом.

Объект передачи данных не должен содержать никакой бизнес-логики, и он должен быть сериализуемым для передачи через соединение. Обычно ассемблер, также называемый маппером, используется для передачи данных между объектами домена и объектами DTO.

Давайте посмотрим на пример класса DTO.

public class Article {
    private long id;
    private long authorId;
    private String text;
    private Timestamp publishTimestamp;
    // getters and setters
}

public class Author {
    private long id;
    private String name;
    private String profileUrl;
    private String profileImageUrl;
    // getters and setters
}

public class ArticleDTO {
    private long id;
    private String text;
    private AuthorDTO author;
    private Timestamp publishTimestamp;
    
    // getters and setters
}

public class AuthorDTO {
    private String name;
    private String profileUrl;
    private String profileImageUrl;
    // getters and setters
}

Удаленный фасад

Удаленный фасад предназначен для минимизации количества удаленных вызовов в приложении. Этот шаблон содержит крупнозернистый интерфейс для одного или нескольких мелкозернистых объектов. Шаблон удаленного фасада не содержит бизнес-логики, он только преобразует крупномасштабные методы в базовые мелкозернистые методы. Часто шаблон удаленного фасада комбинируется с шаблоном объекта передачи данных.

Давайте посмотрим на очень простой пример ...

public class StorageManager {
    public boolean isItemAvailable(int itemId) {
        // implementation...
    }
}

public class Packager {
    public void packItem(int itemId) {
        // implementation...
    }
}

public class RemoteStore {
    private final StorageManager storageManager;
    private final Packager packager;

    public RemoteStore(StorageManager storageManager, 
                       Packager packager) {
        this.storageManager = storageManager;
        this.packager = packager;
    }

    public void buyItem(int itemId) {
        if (storageManager.isItemAvailable(itemId)) {
            packager.packItem(itemId);
        }
        // implementation ...
    }
}

Давайте посмотрим на график, когда объединены паттерны объекта передачи данных и удаленного фасада.