Когда я должен использовать композитный дизайн шаблона? - PullRequest
58 голосов
/ 17 марта 2011

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

Ответы [ 10 ]

67 голосов
/ 17 марта 2011

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

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

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

Встреча:
Предварительный экзамен
Экзамен
Лечение

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

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

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

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

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

30 голосов
/ 17 марта 2011

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

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

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

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

18 голосов
/ 16 июля 2015

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

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

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();

    }

}
6 голосов
/ 17 июня 2015

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

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

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

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

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

И вот один из примеров использования Composite для скрытия частей за составным элементом: CompositeШаблон дизайна

3 голосов
/ 11 ноября 2017

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

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

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

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

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

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

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

2 голосов
/ 20 января 2014

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

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

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

В другом примере есть

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

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

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

2 голосов
/ 14 мая 2013

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

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

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

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

2 голосов
/ 17 марта 2011

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

1 голос
/ 04 мая 2017

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

1 голос
/ 17 марта 2011
...