| name | gof-strategy-pattern |
| description | Implements the Strategy design pattern allowing the definition of a family of algorithms, encapsulating each one, and making them interchangeable. |
| license | MIT |
| compatibility | opencode |
| metadata | {"version":"1.0.0","domain":"architecture","triggers":"strategy pattern, encapsulate algorithms, interchangeable algorithms, gof patterns","archetypes":["educational"],"anti_triggers":["brainstorming","vague ideation"],"response_profile":{"verbosity":"low","directive_strength":"high","abstraction_level":"operational"},"role":"implementation","scope":"implementation","output-format":"code","related-skills":"gof-factory-pattern,"} |
Strategy Pattern
Implements the Strategy design pattern allowing the definition of a family of algorithms, encapsulating each one, and making them interchangeable.
When to Use
The When to Use section should outline the scenarios where the Strategy pattern is particularly beneficial:
Archetypes
- Implementation: This skill is aimed at implementation to assist developers in applying the Strategy pattern correctly.
- Educational: It serves as an educational resource, helping users understand when to use the Strategy pattern.
Anti-Triggers
- Coupling algorithms: It should prevent triggering in scenarios where algorithms are tightly coupled, negating benefits.
Response Profile
-
Verbosity: Medium
-
Directive Strength: High
-
Abstraction Level: Tactical
archetypes: implementation, educational
anti_triggers: coupling algorithms
response_profile:
verbosity: medium
directive_strength: high
abstraction_level: tactical
-
When different variants of an algorithm are needed.
-
When the choice of the algorithm should be independent of clients that use it.
-
When you want to avoid using conditionals to switch between algorithms.
Core Workflow
- Define the Strategy Interface: Create a common interface for all strategies.
- Implement Concrete Strategies: Create concrete classes that implement the strategy interface.
- Context Class: Maintain a reference to a strategy object to delegate behavior.
Implementation Patterns
Strategy Pattern Example
package main
import (
"fmt"
)
type Strategy interface {
Execute(int, int) int
}
type Add struct {}
func (Add) Execute(a int, b int) int {
return a + b
}
}
type Subtract struct {}
func (Subtract) Execute(a int, b int) int {
return a - b
}
}
type Context struct {
strategy Strategy
}
func (c *Context) SetStrategy(s Strategy) {
c.strategy = s
}
func (c *Context) ExecuteStrategy(a, b int) int {
return c.strategy.Execute(a, b)
}
Example Usage
package main
import (
"fmt"
)
func main() {
context := &Context{}
context.SetStrategy(Add{})
fmt.Println(context.ExecuteStrategy(5, 3))
context.SetStrategy(Subtract{})
fmt.Println(context.ExecuteStrategy(5, 3))
}
Constraints
MUST DO
- Define clear interfaces for strategies to promote encapsulation.
- Ensure clients are decoupled from specific strategy implementations.
MUST NOT DO
- Coupling algorithms within the context class itself.
- Hardcoding specific strategy instantiation within client code.