
protocol Strategy {
func doOperation(_ a: Int, _ b: Int) -> Int
}
//ConcreteStrategy
class AddStrategy: Strategy {
func doOperation(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
//ConcreteStrategy
class SubstractStrategy: Strategy {
func doOperation(_ a: Int, _ b: Int) -> Int {
return a - b
}
}
//Context
class Calc {
var strategy: Strategy?
func execute(_ a: Int, _ b: Int) -> Int {
if strategy == nil {
return 0
}
return strategy!.doOperation(a, b)
}
func setStrategy(_ strategy: Strategy) {
self.strategy = strategy
}
}
let calc = Calc()
let result1 = calc.execute(5, 3)
//result1 is 0
calc.setStrategy(AddStrategy())
let result2 = calc.execute(5, 3)
//result2 is 8
calc.setStrategy(SubstractStrategy())
let result3 = calc.execute(5, 3)
//result3 is 2
print("result1 is \(result1)")
print("result2 is \(result2)")
print("result3 is \(result3)")
| Определяет семейство алгоритмов, инкапсулируя их и позволяя подставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется. |