策略模式

发布时间 2023-08-30 15:19:49作者: INnoVation-V2

策略模式

1. 简介

策略模式(Strategy Pattern)允许在运行时选择算法或行为,从一组算法中选择一个合适的实现。这种模式使得算法的变化可以独立于使用算法的客户端。

策略模式的核心思想是将不同的算法封装成各自的策略类,然后在一个上下文类中维护一个策略接口的实例,根据需求动态切换具体的策略。这样,客户端代码不需要知道具体的算法,只需要与策略接口交互。

2. 策略模式的组成

  1. Context(上下文):维护一个对策略接口的引用,通过该接口调用具体的策略实现。Context 可以根据需要动态地切换策略,客户端通过 Context 使用不同的算法,而不必关心具体算法的实现。
  2. Strategy(策略):策略接口或抽象类,定义了一系列可替换的算法。这些算法在实际使用时会被具体的策略类实现。
  3. 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)
}

在上述代码中,

  1. Strategy 是策略接口
  2. QuickSortMergeSort 是具体策略类
  3. Context 是上下文类,负责根据选择的策略调用相应的算法