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