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