Когда следует использовать шаблон составного дизайна?

Я не понимаю , когда должен использовать шаблон составного дизайна. Какие преимущества я получу от этого шаблона проектирования? Я посетил этот сайт, но он только рассказывает мне о структуре шаблона проектирования, а не о сценариях, в которых он используется. Я надеюсь, что это будет полезно для таких программистов, как я, которые начинают изучать шаблон дизайна.

Ответ 1

Цитата из Шаблоны проектирования,

Используйте шаблон Composite, когда

  • вы хотите представлять иерархии объектов целого целого.
  • вы хотите, чтобы клиенты могли игнорировать разницу между композиции объектов и отдельные объекты. Клиенты обрабатывать все объекты в составном структура равномерно.

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

Ответ 2

A Composite - это шаблон, который полезен в любое время, когда вам может потребоваться выборочно обрабатывать группу объектов, которые являются частью иерархии как "одинаковые", когда они фактически различны. Обычно используемые примеры говорят с точки зрения обработки листьев и узлов одинаково, но шаблон также можно распространять на гетерогенные списки.

Например, рассмотрите посещение врача. Когда вы идете к врачу, происходят разные вещи, вы обычно видите медсестру или помощника, они принимают вашу температуру и т.д. Затем врач выполняет экзамен и делает диагноз. Затем врач может сделать какое-то лечение, но часто медсестра возвращается, чтобы закончить. В ходе визита проводятся различные мероприятия. У вас есть наблюдения, такие как вес и температура. Но лаборатория, например, будет другим объектом, потому что она часто требует образца, который затем может быть отправлен и требует, чтобы результаты были записаны позднее.

Итак, у нас есть программное обеспечение, которое позволяет записывать все это, и оно обычно создает некоторую иерархию с такими узлами, как:

Encounter:
  PreExam
  Экзамен
  Лечение

и под каждым из этих узлов вы будете иметь множество записей, таких как диагностика, наблюдение, лабораторная процедура, диагностика, инъекция и т.д.

Это хорошо и хорошо, и вы получаете структурированную, хотя и очень сложную иерархическую запись встречи.

Теперь предположим, что вам нужно создать биллинг. Внезапно вы сталкиваетесь с совершенно другим требованием. Ваша медицинская запись была необходима для создания очень точной картины встречи. При выставлении счетов, хотя вам все равно, кто что сделал или в каком порядке, на самом деле вам все равно, что происходит за пределами кода выставления счетов. Вам просто нужен один список оплачиваемых действий, т.е. коды.

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

Композитный шаблон решает все это. Вы определяете общий интерфейс или базовый класс для всех объектов. Позвольте называть его "CareEntry". CareEntry имеет свойство BillingCode. Теперь ваш Encounter может казаться простым контейнером, в котором есть только объекты CareEntry. Теперь ваш биллинговый сервис просто перечислит все, не беспокоясь о том, что-то есть node (PreExam, Exam) по сравнению с листом (температура веса) или что node объект находится (экзамен PreExam и т.д.) Или каков фактический тип объекта (лаборатория, инъекция и т.д.). Все также относится к CareEntry и обрабатывается равномерно. Вы просто перечисляете все объекты CareEntry в Encounter и собираете каждый, у которого есть нулевой код фактурирования, и все готово. Это так просто.

Ответ 3

Композитный шаблон позволяет клиентам обрабатывать отдельные объекты, а также композиции (отдельных объектов) равномерно.
Например, при двойном щелчке папки он должен открыть папку. В двойном файле он должен быть открыт в соответствующей программе.
Операция такая же, но ведет себя на основе того, являются ли они отдельными объектами или композициями

Общий интерфейс для отдельных объектов и составных объектов

interface Data{
    public void doubleClick();
}

Реализация отдельных объектов

class File implements Data {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void doubleClick() {
        System.out.println(this.getName()+" file is Opened in a Program ");
    }
}

Композитная реализация

class Folder implements Data {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    private List<Data> folder = new ArrayList<Data>();

    @Override
    public void doubleClick() {
        System.out.println(this.getName() + " folder is Opened");
        for(Data data : folder) {
            data.doubleClick();
        }
    }

    public void add(Data data) {
        folder.add(data);
    }

    public void remove(Data data) {
        folder.remove(data);
    }
}

Клиентская программа

public class CompositePattern {

    public static void main(String[] args) {

        Folder f1 = new Folder();f1.setName("Folder 1");
        Folder f2 = new Folder();f2.setName("Folder 2");
        Folder f3 = new Folder();f3.setName("Folder 3");

        File file1 = new File();file1.setName("File 1");
        File file2 = new File();file2.setName("File 2");
        File file3 = new File();file3.setName("File 3");
        File file4 = new File();file4.setName("File 4");

        f1.add(file1);
        f2.add(file2);

        f3.add(f2);
        f3.add(file3);
        f3.add(file4);

        f1.doubleClick();f2.doubleClick();f3.doubleClick();

    }

}

Ответ 4

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

Это проблема, потому что класс, содержащий коллекцию, затем переполняется петлями foreach, которые в основном делают одно и то же - пройдите через все элементы и примените некоторую совокупную функцию.

Чтобы решить эту проблему, я представляю интерфейс, который реализуется одним элементом, а также класс, скрывающий коллекцию этих элементов. Цель составного класса состоит в том, чтобы затем содержать все агрегированные функции, которые раньше были в классе клиента.

В этой статье вы найдете несколько полезных примеров: Работа с коллекциями

Общепринятое состоит в том, что Composite не обязательно представляет отношения частичного целого. Можно ввести составной элемент только для перемещения контуров из клиента.

И вот один пример книги с применением шаблона Composite для скрытия деталей за составным элементом: Композитный шаблон дизайна

Ответ 5

Вы можете обнаружить, что это необходимо, когда вы будете работать с binary trees или другим complex data structures like list of lists of lists - etc... тогда, когда каждый элемент (класс) реализует 1 интерфейс, вы можете использовать те же методы для 1 лист или целая группа из них - обход, добавление, удаление, перемещение... независимо от того, что вы правильно выполнили. Это очень полезно и просто.

Ответ 6

Ответ должен быть -

Составляйте объекты в древовидные структуры для представления иерархии целых частей. Composite позволяет клиентам обрабатывать отдельные объекты и композиции объектов равномерно.

  • Рекурсивная композиция
  • "Каталоги содержат записи, каждая из которых может быть каталогом.
  • 1-to-many "имеет" вверх ", это" иерархия "

скопирован с форума.

Ответ 8

Композитный образец шаблона реального мира, Когда у нас есть вероятность наличия экземпляра того же типа родительского типа внутри или типа компонента.

Пример: В валютных торговых системах Ex1

У вас может быть кросс-валютная пара (AUD/EUR)= (AUD/USD и 1/(EUR/USD)) точка здесь - ваш Инструмент (Крест) может иметь два Инструменты (прямые) внутри.

В другом примере

Один инструмент (крест) и инструмент (прямой) и инструмент (крест) который может быть далее разделен на буксир Instrument (Direct). SGD/CZK = USD/SGD (прямой) и USD/CZK (кросс) = USD/SGD (прямой) и (1/EUR/USD) (прямой) и EUR/CZK (прямой)

Здесь вы продолжаете делиться, пока не найдете все прямые валютные пары.

Выше может быть легко реализовано с использованием шаблона Composite Design.

Ответ 9

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

Ответ 10

Недавно изучив и попробовав мне руку, я узнал одну мощную концепцию, чтобы иметь в виду о композитах.

Композиты скрывают сложность, связанную с коллекциями, то есть зацикливая их, сортируя их, фильтруя некоторые и т.д. и позволяя обрабатывать ее, как если бы это был единственный организм.

Скажите, у вас есть собака в одном питомнике и много собак у другого. Вы хотите их кормить и вакцинировать, но вы не можете кормить их, если они ели в течение часа или кормили их, если они были вакцинированы за последние пять часов, или вакцинировали их, если их рвало и т.д.

Что еще более важно, есть правила порядка упаковки, где собачья порода A ест до породы B, если собака породы C не была вокруг и лаяла к верхней части его легких.

Это быстро достигнет точки, когда вы просто не хотите заботиться ни о чем, но просто позвоните помощнику и скажите ему, чтобы он кормил всех собак. Или лучше, три помощника, чтобы следить за кормлением, вакцинацией и рвотой, лаем и упаковкой и всеми другими удивительными вещами.

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

Итак, для вас собака - это IDog, у которой Feed(), Bark(), Vomit() и GetVaccine(). Питомник также является Собакой, которую вы называете питомником .Feed(). Вы сделали. Питомник питомника должен выяснить, что делать теперь внутренне. Он может иметь механизм сохранения времени, чтобы следить за каждым кормлением собак и другими временами функционирования организма. Все это инкапсулировано аккуратно.