Композитный паттерн (Composite pattern) — это паттерн проектирования, который позволяет работать с группой котиков объектов так же, как с одиночным котиком объектом. Этот паттерн объединяет котиков в древовидную структуру и позволяет клиентам единообразно работать с отдельными самостоятельными котами и группами котиков.
Допустим, у нас есть класс Cat, который представляет собой одиночного кота. Теперь представим, что мы хотим создать иерархию котов, чтобы работать с ними как с единым объектом. Для этого мы можем создать абстрактный класс CatComponent, который будет иметь общий интерфейс для работы и представляет одновременно и одиночного котика и группу котов.
Теперь мы можем создать два класса: SingleCat, который представляет собой одиночного кота, и CatGroup, который представляет собой группу котов. В классе CatGroup будет список объектов CatComponent, которые могут быть как отдельными котами, так и группами котов.
Теперь мы можем создать иерархию котов:
// Создаем одиночных котиков
val fluffy = SingleCat("Fluffy")
val mittens = SingleCat("Mittens")
// Создаем группу котов и добавляем в нее одиночных котов
val group1 = CatGroup("Group 1")
group1.add(fluffy)
group1.add(mittens)
// Создаем еще одного одиночного кота
val whiskers = SingleCat("Whiskers")
// Создаем еще одну группу котов и добавляем в нее одиночного кота и другую группу котов
val group2 = CatGroup("Group 2")
group2.add(whiskers)
group2.add(group1)
// Вызываем метод meow для всех котов
group2.meow()
В этом примере мы создали трех одиноких котика: Fluffy, Mittens и Whiskers. Затем мы создали две группы котов: Group 1 и Group 2. Мы добавили Fluffy и Mittens в Group 1, а затем добавили Group 1 и Whiskers в Group 2. Наконец, мы вызвали метод meow() для Group 2, что заставило всех котов мяукнуть.
Когда мы вызываем метод meow() для Group 2, он сначала печатает "Group 2", а затем вызывает метод meow() для каждого объекта в списке catComponents, включая SingleCat Fluffy, SingleCat Mittens и CatGroup Group 1. Каждый из этих объектов выполняет свою собственную реализацию метода meow(), которая печатает свое имя и мяукает.
Таким образом, мы использовали композитный паттерн чтобы работать с группой котов так же, как с одиночным котом.
Мы создали абстрактный класс CatComponent, который представляет собой как отдельного кота, так и группу котов. Затем мы создали классы SingleCat и CatGroup, которые реализуют интерфейс CatComponent и представляют собой одиночных котов и группы котов соответственно. Каждый объект в иерархии котов может выполнять свое собственное meow(), и метод meow() для группы котов вызывает метод meow() для каждого объекта в списке catComponents, включая другие группы котов и отдельных котов.
Мяу :)
Как выглядит UML-схемка:
P.S. Спасибо ChatGPT за помощь с генерацией кодом :)