Скажем, у нас есть данные.
class Data
Данные нужны чтобы их отправлять.
class Data {
fun send() {}
}
Данные можно конвертировать в json, yaml и xml
class Data {
fun sendJson() {}
fun sendXml() {}
fun sendYaml() {}
}
Пока все еще норм. Но начинаются вопросы.
Данные можно отправлять по емайлу, на акк телеги, по смс
class Data {
fun sendJsonToEmail() {}
fun sendXmlToEmail() {}
fun sendYamlToEmail() {}
fun sendJsonToTelegram() {}
fun sendXmlToTelegram() {}
fun sendYamlToTelegram() {}
fun sendJsonToSms() {}
fun sendXmlToSms() {}
fun sendYamlToSms() {}
}
И вот тут мы понимаем, что творим какую-то хрень.
Поэтому выносим форматы и протоколы в отдельные классы
interface Formatter {
fun format(data: String): String
}
interface Sender {
fun send(data: String): Boolean
}
class Data(val formater: Formatter, val sender: Sender) {
fun send(data: String) = sender.send(formatter.format(data))
}
Вот это делегация в моем понимании. Мы вынесли форматирование и отправку в отдельные интерфейсы, и теперь можем заимплементироваться по уши, но главный класс не трогать.
Котлин даёт небольшие синтаксические плюшки и все.
Поправьте если я неправ.