策略模式
1. 简介
策略模式(Strategy Pattern)允许在运行时选择算法或行为,从一组算法中选择一个合适的实现。这种模式使得算法的变化可以独立于使用算法的客户端。
策略模式的核心思想是将不同的算法封装成各自的策略类,然后在一个上下文类中维护一个策略接口的实例,根据需求动态切换具体的策略。这样,客户端代码不需要知道具体的算法,只需要与策略接口交互。
2. 策略模式的组成
- Context(上下文):维护一个对策略接口的引用,通过该接口调用具体的策略实现。Context 可以根据需要动态地切换策略,客户端通过 Context 使用不同的算法,而不必关心具体算法的实现。
- Strategy(策略):策略接口或抽象类,定义了一系列可替换的算法。这些算法在实际使用时会被具体的策略类实现。
- ConcreteStrategy(具体策略):实现了策略接口的具体算法类。每个具体策略类都封装了一种特定的算法实现。
3. 策略模式的优点:
- 灵活性:可以在运行时切换算法,而不需要修改客户端代码。
- 可维护性:将不同的算法封装在不同的策略类中,使得代码更易于理解和维护。
- 可扩展性:可以方便地新增新的策略类,扩展算法的选择范围。
4. 代码
package main
import "fmt"
type Strategy interface {
Sort(data []any)
}
type QuickSort struct{}
func (q *QuickSort) Sort(data []any) {
fmt.Printf("QuickSort %v\n", data)
}
type MergeSort struct{}
func (q *MergeSort) Sort(data []any) {
fmt.Printf("MergeSort %v\n", data)
}
type Context struct {
strategy Strategy
}
func NewContext(strategy Strategy) *Context {
return &Context{
strategy: strategy,
}
}
func (c *Context) performSort(data []any) {
c.strategy.Sort(data)
}
func main() {
data := []any{1, 2, 3, 4}
quickSortStrategy := QuickSort{}
mergeSortStrategy := MergeSort{}
context := NewContext(&quickSortStrategy)
context.performSort(data)
context.strategy = &mergeSortStrategy
context.performSort(data)
}
在上述代码中,
Strategy是策略接口QuickSort和MergeSort是具体策略类Context是上下文类,负责根据选择的策略调用相应的算法