Kotlin composite pattern

How to write a composite pattern in Kotlin

An example of a composite pattern in Kotlin.

Table of contents for design patterns in Kotlin

In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes a group of objects that are treated the same way as a single instance of the same type of object. The intent of a composite is to “compose” objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly. Wikipedia

Example:

Subject

open class Employee(private val name: String, private val salary: Double) {
    open fun getSalary(): Double = salary
    open fun getInfo(): String = "$name $salary"
}

Composite

class Composite(private val name: String) : Employee(name, 0.0) {
    private val employees = mutableListOf<Employee>()

    fun add(employee: Employee) = employees.add(employee)

    override fun getSalary(): Double = employees.sumByDouble { it.getSalary() }

    override fun getInfo(): String = StringBuilder().apply {
        appendln("$name ${employees.sumByDouble { it.getSalary() }}")
        employees.forEach { employee ->
            employee.getInfo().lines().filter { it.isNotBlank() }.forEach {
                appendln("\t$it")
            }
        }
    }.toString()
}

Usage:

fun main() {
    val devTeam = Composite("devTeam").apply {
        add(Employee("developer", 32.0))
        add(Employee("tester", 64.0))
    }
    val marketTeam = Composite("marketTeam").apply {
        add(Employee("seller", 128.0))
        add(Employee("operator", 256.0))
    }
    val company = Composite("company").apply {
        add(devTeam)
        add(marketTeam)
        add(Employee("Manager", 1024.00))
        add(Employee("Director", 2048.00))
    }
    println(company.getInfo())
    println(company.getSalary())
}

Result

company 3552.0
	devTeam 96.0
		developer 32.0
		tester 64.0
	marketTeam 384.0
		seller 128.0
		operator 256.0
	Manager 1024.0
	Director 2048.0

3552.0