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

import (
    "fmt"
)

//Strategy with integer operation
type Strategy interface {
    DoOperation(a int, b intint
}

//AddStrategy is ConcreteStrategy
type AddStrategy struct{}

//DoOperation is integer addition function
func (s AddStrategyDoOperation(a int, b intint {
    return a + b
}

//SubstractStrategy is ConcreteStrategy
type SubstractStrategy struct{}

//DoOperation is integer subtraction function
func (s SubstractStrategyDoOperation(a int, b intint {
    return a - b
}

//Calc is Context
type Calc struct {
    _strategy Strategy
}

//Execute current strategy
func (c CalcExecute(a int, b intint {
    if c._strategy == nil {
        return 0
    }

    return c._strategy.DoOperation(a, b)
}

//SetStrategy changes the current strategy
func (c *Calc) SetStrategy(strategy Strategy) {
    c._strategy = strategy
}

//Client
calc := Calc{}
result1 := calc.Execute(53)
//result1 is 0

calc.SetStrategy(AddStrategy{})
result2 := calc.Execute(53)
//result2 is 8

calc.SetStrategy(SubstractStrategy{})
result3 := calc.Execute(53)
//result3 is 2

fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3)


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