MrOzOn 4 лет назад
Родитель
Сommit
9a14d89253

+ 25 - 1
src/structural_patterns/README.MD

@@ -58,4 +58,28 @@
 
 - отделение реализации от интерфейса
 - повышение степени расширяемости
-- сокрытие деталей реализации от клиентов
+- сокрытие деталей реализации от клиентов
+
+# [Компоновщик (Composite)](./composite/main.kt)
+
+Это структурный паттерн проектирования, который позволяет сгруппировать множество объектов в древовидную структуру, а затем работать с ней так, как будто это единичный объект.
+
+## Применимость
+
+- требуется представить иерархию объектов вида «часть — целое»
+- клиенты должны по единым правилам работать с составными и индивидуальными объектами
+
+## Отношения
+
+Клиенты используют интерфейс класса Graphic для взаимодействия с объектами в составной структуре. Если получателем запроса является листовый объект (Dot, Circle), то он и обрабатывает запрос. Когда же получателем является составной объект CompoundGraphic, то обычно он перенаправляет запрос своим потомкам — возможно, с выполнением некоторых дополнительных операций до или после перенаправления.
+
+## Результаты
+
+- определяет иерархии классов, состоящие из примитивных и составных объектов
+- упрощает архитектуру клиента
+- облегчает добавление новых видов компонентов. Новые подклассы классов CompoundGraphic или Dot, Circle будут автоматически работать с уже существующими структурами и клиентским кодом.
+- способствует созданию общего дизайна
+
+**_Важно_**
+
+Иногда бывает нужно, чтобы составной объект мог включать только определенные виды компонентов. Паттерн компоновщик не позволяет воспользоваться для реализации таких ограничений статической системой типов. Вместо этого приходится проводить проверки во время выполнения.

+ 21 - 0
src/structural_patterns/composite/GraphicImpl.kt

@@ -0,0 +1,21 @@
+package structural_patterns.composite
+
+class Dot(private var x:Int, private var y: Int): Graphic {
+    override fun move(x: Int, y: Int) {
+        this.x += x
+        this.y += y
+    }
+    override fun draw() {
+        println("draw Dot in coordinate ($x, $y)")
+    }
+}
+
+class Circle(private val x: Int, private val y: Int, private val radius: Int): Graphic{
+    override fun move(x: Int, y: Int) {
+        // realise moving circle relative to it center
+        println("realise moving circle relative to it center")
+    }
+    override fun draw() {
+        println("draw Circle in coordinate ($x, $y) and radius = $radius")
+    }
+}

+ 34 - 0
src/structural_patterns/composite/Graphics.kt

@@ -0,0 +1,34 @@
+package structural_patterns.composite
+
+// this is general interface for any component
+interface Graphic {
+    fun move(x: Int, y: Int)
+    fun draw()
+}
+
+class CompoundGraphic: Graphic {
+
+    private val children: MutableList<Graphic> = mutableListOf()
+
+    override fun move(x: Int, y: Int) {
+        children.forEach { child ->
+            child.move(x,y)
+        }
+    }
+
+    override fun draw() {
+        println("draw CompoundGraphic:")
+        children.forEach { child ->
+            child.draw()
+        }
+    }
+
+    fun add(child: Graphic) {
+        children.add(child)
+    }
+
+    fun remove(child: Graphic) {
+        children.remove(child)
+    }
+
+}

+ 16 - 0
src/structural_patterns/composite/main.kt

@@ -0,0 +1,16 @@
+package structural_patterns.composite
+
+fun main(){
+    val graphicElements: MutableList<Graphic> = mutableListOf()
+    graphicElements.add(Dot(1,1))
+    graphicElements.add(Dot(3,4))
+    graphicElements.add(Circle(3,5, 10))
+    val compoundGraphic = CompoundGraphic()
+    compoundGraphic.add(Dot(2,2))
+    compoundGraphic.add(Circle(7,7, 7))
+    graphicElements.add(compoundGraphic)
+
+    graphicElements.forEach { element ->
+        element.draw()
+    }
+}