2017-04-28 16:11:28 +03:00
|
|
|
# Strategy Pattern
|
2016-04-15 14:51:23 +03:00
|
|
|
Strategy behavioral design pattern enables an algorithm's behavior to be selected at runtime.
|
|
|
|
|
|
|
|
It defines algorithms, encapsulates them, and uses them interchangeably.
|
|
|
|
|
|
|
|
## Implementation
|
|
|
|
Implementation of an interchangeable operator object that operates on integers.
|
|
|
|
|
|
|
|
```go
|
|
|
|
type Operator interface {
|
|
|
|
Apply(int, int) int
|
|
|
|
}
|
|
|
|
|
|
|
|
type Operation struct {
|
|
|
|
Operator Operator
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o *Operation) Operate(leftValue, rightValue int) int {
|
|
|
|
return o.Operator.Apply(leftValue, rightValue)
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
### Addition Operator
|
|
|
|
```go
|
|
|
|
type Addition struct{}
|
|
|
|
|
|
|
|
func (Addition) Apply(lval, rval int) int {
|
|
|
|
return lval + rval
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```go
|
|
|
|
add := Operation{Addition{}}
|
|
|
|
add.Operate(3, 5) // 8
|
|
|
|
```
|
|
|
|
|
|
|
|
### Multiplication Operator
|
|
|
|
```go
|
|
|
|
type Multiplication struct{}
|
|
|
|
|
|
|
|
func (Multiplication) Apply(lval, rval int) int {
|
|
|
|
return lval * rval
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```go
|
|
|
|
mult := Operation{Multiplication{}}
|
|
|
|
|
|
|
|
mult.Operate(3, 5) // 15
|
|
|
|
```
|
|
|
|
|
|
|
|
## Rules of Thumb
|
|
|
|
- Strategy pattern is similar to Template pattern except in its granularity.
|
|
|
|
- Strategy pattern lets you change the guts of an object. Decorator pattern lets you change the skin.
|