Операция выполнена!
Закрыть
Хабы: Kotlin

Паттерны проектирования на языке Kotlin

Эта статья является продолжением. Первая часть статьи здесь.

Поведенческие паттерны

13. Chain of Responsibility (Цепочка обязанностей)

Описание: Позволяет передавать запросы последовательно по цепочке обработчиков.

Когда использовать: Когда есть более одного объекта, который может обработать запрос.

Пример кода:

abstract class Handler(private val next: Handler?) { open fun handle(request: String) { next?.handle(request) } } class AuthenticationHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { if (request.contains("auth")) { println("Аутентификация прошла") super.handle(request) } else { println("Аутентификация не удалась") } } } class LoggingHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { println("Логирование запроса: $request") super.handle(request) } } fun main() { val handler = AuthenticationHandler(LoggingHandler(null)) handler.handle("auth: запрос к ресурсу") }

14. Command (Команда)

Описание: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с разными запросами.

Когда использовать: Когда нужно параметризовать объекты выполняемым действием.

Пример кода:

interface Command { fun execute() } class Light { fun turnOn() = println("Свет включен") fun turnOff() = println("Свет выключен") } class TurnOnCommand(private val light: Light) : Command { override fun execute() = light.turnOn() } class TurnOffCommand(private val light: Light) : Command { override fun execute() = light.turnOff() } class RemoteControl { private val commands = mutableListOf<Command>() fun addCommand(command: Command) = commands.add(command) fun executeCommands() = commands.forEach { it.execute() } } fun main() { val light = Light() val turnOn = TurnOnCommand(light) val turnOff = TurnOffCommand(light) val remote = RemoteControl() remote.addCommand(turnOn) remote.addCommand(turnOff) remote.executeCommands() }

15. Iterator (Итератор)

Описание: Предоставляет способ последовательного доступа к элементам агрегатного объекта без раскрытия его внутреннего представления.

Когда использовать: Когда нужно предоставить единый интерфейс для обхода различных коллекций.

Пример кода:

class Notification(val message: String) class NotificationCollection { private val notifications = mutableListOf<Notification>() fun addNotification(notification: Notification) = notifications.add(notification) fun iterator(): Iterator<Notification> = notifications.iterator() } fun main() { val collection = NotificationCollection() collection.addNotification(Notification("Уведомление 1")) collection.addNotification(Notification("Уведомление 2")) collection.addNotification(Notification("Уведомление 3")) val iterator = collection.iterator() while (iterator.hasNext()) { val notification = iterator.next() println(notification.message) } }

16. Mediator (Посредник)

Читать далее
Читайте также
НОВОСТИ

ПИШИТЕ

Техническая поддержка проекта ВсеТут

info@vsetut.pro