mirror of
https://github.com/tmrts/go-patterns.git
synced 2024-12-01 01:06:02 +03:00
42 lines
994 B
Markdown
42 lines
994 B
Markdown
|
# Decorator Pattern
|
||
|
Decorator structural pattern allows extending the function of an existing object dynamically without altering its internals.
|
||
|
|
||
|
Decorators provide a flexible method to extend functionality of objects.
|
||
|
|
||
|
## Implementation
|
||
|
`LogDecorate` decorates a function with the signature `func(int) int` that
|
||
|
manipulates integers and adds input/output logging capabilities.
|
||
|
|
||
|
```go
|
||
|
type Object func(int) int
|
||
|
|
||
|
func LogDecorate(fn Object) Object {
|
||
|
return func(n int) int {
|
||
|
log.Println("Starting the execution with the integer", n)
|
||
|
|
||
|
result := fn(n)
|
||
|
|
||
|
log.Println("Execution is completed with the result", result)
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
```go
|
||
|
func Double(n int) int {
|
||
|
return n * 2
|
||
|
}
|
||
|
|
||
|
f := LogDecorate(Double)
|
||
|
|
||
|
f(5)
|
||
|
// Starting execution with the integer 5
|
||
|
// Execution is completed with the result 10
|
||
|
```
|
||
|
|
||
|
## Rules of Thumb
|
||
|
- Unlike Adapter pattern, the object to be decorated is obtained by **injection**.
|
||
|
- Decorators should not alter the interface of an object.
|