From a040b31118e3a899b33b922f11a546d37758504f Mon Sep 17 00:00:00 2001 From: Aleh Barushka <1.alehbarushka@gmail.com> Date: Sun, 29 Oct 2023 19:11:04 +0300 Subject: [PATCH 1/2] feat: add Singleton, Builder, Command and Decorator patterns --- src/main/kotlin/ru/otus/patterns/Builder.kt | 34 +++++++++++++++++ src/main/kotlin/ru/otus/patterns/Command.kt | 38 +++++++++++++++++++ src/main/kotlin/ru/otus/patterns/Decorator.kt | 30 +++++++++++++++ src/main/kotlin/ru/otus/patterns/Singleton.kt | 13 +++++++ 4 files changed, 115 insertions(+) create mode 100644 src/main/kotlin/ru/otus/patterns/Builder.kt create mode 100644 src/main/kotlin/ru/otus/patterns/Command.kt create mode 100644 src/main/kotlin/ru/otus/patterns/Decorator.kt create mode 100644 src/main/kotlin/ru/otus/patterns/Singleton.kt diff --git a/src/main/kotlin/ru/otus/patterns/Builder.kt b/src/main/kotlin/ru/otus/patterns/Builder.kt new file mode 100644 index 0000000..3f82af8 --- /dev/null +++ b/src/main/kotlin/ru/otus/patterns/Builder.kt @@ -0,0 +1,34 @@ +package ru.otus.patterns + +class FoodOrder private constructor( + val bread: String? = "Flat bread", + val condiments: String?, + val meat: String?, + val fish: String? +) { + data class Builder( + var bread: String? = null, + var condiments: String? = null, + var meat: String? = null, + var fish: String? = null + ) { + + fun bread(bread: String) = apply { this.bread = bread } + fun condiments(condiments: String) = apply { this.condiments = condiments } + fun meat(meat: String) = apply { this.meat = meat } + fun fish(fish: String) = apply { this.fish = fish } + fun build() = FoodOrder(bread, condiments, meat, fish) + fun randomBuild() = bread(bread ?: "dry") + .condiments(condiments ?: "pepper") + .meat(meat ?: "beef") + .fish(fish ?: "Tilapia") + .build() + } +} + +val foodOrder = FoodOrder.Builder() + .bread("white bread") + .meat("bacon") + .fish("salmon") + .condiments("olive oil") + .build() \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/patterns/Command.kt b/src/main/kotlin/ru/otus/patterns/Command.kt new file mode 100644 index 0000000..5dbc925 --- /dev/null +++ b/src/main/kotlin/ru/otus/patterns/Command.kt @@ -0,0 +1,38 @@ +package ru.otus.patterns + +interface Command { + fun execute() +} + +data class AddCommand(val x: Int, val y: Int) : Command { + override fun execute() { + val result = x + y + println("+($x, $y) => $result") + + } +} + +data class SubCommand(val x: Int, val y: Int) : Command { + override fun execute() { + val result = x - y + println("-($x, $y) => $result") + } +} + +fun executeCommand(command: Command) { + command.execute() +} + +fun runCommands(vararg commands: Command) { + for (command in commands) { + executeCommand(command) + } +} + +fun main() { + runCommands( + AddCommand(1, 2), + SubCommand(4, 7) + ) +} + diff --git a/src/main/kotlin/ru/otus/patterns/Decorator.kt b/src/main/kotlin/ru/otus/patterns/Decorator.kt new file mode 100644 index 0000000..a5b5674 --- /dev/null +++ b/src/main/kotlin/ru/otus/patterns/Decorator.kt @@ -0,0 +1,30 @@ +package ru.otus.patterns + +interface Camera { + fun takePicture() + fun addFilter() +} + +interface Phone { + fun makeCall() + fun installApp() +} + +class CameraPhone(private val camera: Camera, private val phone: Phone) : Camera, Phone { + override fun takePicture() { + camera.takePicture() + } + + override fun addFilter() { + camera.addFilter() + } + + override fun makeCall() { + phone.makeCall() + } + + override fun installApp() { + phone.installApp() + } +} + diff --git a/src/main/kotlin/ru/otus/patterns/Singleton.kt b/src/main/kotlin/ru/otus/patterns/Singleton.kt new file mode 100644 index 0000000..f36a5f4 --- /dev/null +++ b/src/main/kotlin/ru/otus/patterns/Singleton.kt @@ -0,0 +1,13 @@ +package ru.otus.patterns + +private class Singleton { + companion object { + private var instance: Singleton? = null + fun getInstance(): Singleton { + if (instance == null) { + instance = Singleton() + } + return instance!! + } + } +} \ No newline at end of file From d41c278fb6ab563e5f73dfe6b6602d8df4c366d9 Mon Sep 17 00:00:00 2001 From: Aleh Barushka <1.alehbarushka@gmail.com> Date: Mon, 30 Oct 2023 23:31:36 +0300 Subject: [PATCH 2/2] fix: update Decorator --- src/main/kotlin/ru/otus/patterns/Decorator.kt | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/ru/otus/patterns/Decorator.kt b/src/main/kotlin/ru/otus/patterns/Decorator.kt index a5b5674..0fb5858 100644 --- a/src/main/kotlin/ru/otus/patterns/Decorator.kt +++ b/src/main/kotlin/ru/otus/patterns/Decorator.kt @@ -1,30 +1,43 @@ package ru.otus.patterns -interface Camera { - fun takePicture() - fun addFilter() +import kotlin.random.Random + +fun main() { + WithRepeat(PhoneInstance()).makeCall() } + interface Phone { - fun makeCall() - fun installApp() + fun makeCall(): Boolean } -class CameraPhone(private val camera: Camera, private val phone: Phone) : Camera, Phone { - override fun takePicture() { - camera.takePicture() - } - override fun addFilter() { - camera.addFilter() - } +class PhoneInstance() : Phone { + override fun makeCall(): Boolean { + println("Try calling...") - override fun makeCall() { - phone.makeCall() + val success = Random.nextInt(0, 10) + return success == 1 } +} - override fun installApp() { - phone.installApp() + +class WithRepeat(private val phone: PhoneInstance) : Phone { + override fun makeCall(): Boolean { + fun trying() { + val success = phone.makeCall() + + if (!success) { + println("Error Call") + println("Calling a second time") + trying() + } + } + + trying() + + return true } } +