Паттерны / Паттерны поведения
image

interface Strategy {
    fun doOperation(a: Int, b: Int): Int
}

//ConcreteStrategy
class AddStrategyStrategy {
    override fun doOperation(a: Int, b: Int): Int {
        return a + b
    }
}

//ConcreteStrategy
class SubstractStrategyStrategy {
    override fun doOperation(a: Int, b: Int): Int {
        return a - b
    }
}

//Context
class Calc {
    private var strategy: Strategy? = null

    fun execute(a: Int, b: Int): Int {
        if (strategy == null) {
            return 0
        }
        return strategy!!.doOperation(a, b)
    }

    fun setStrategy(strategy: Strategy) {
        this.strategy = strategy
    }
}

//Client
val calc = Calc()
val result1 = calc.execute(53)
//result1 is 0

calc.setStrategy(AddStrategy())
val result2 = calc.execute(53)
//result2 is 8

calc.setStrategy(SubstractStrategy())
val result3 = calc.execute(53)
//result3 is 2

println("result1 is $result1")
println("result2 is $result2")
println("result3 is $result3")


Определяет семейство алгоритмов, инкапсулируя их и позволяя подставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется.