策略模式原理

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。
 
策略模式的核心思想是将算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。客户端通过使用一个共同的接口来调用具体的策略类,从而实现了算法的动态切换。
 
策略模式包含以下几个角色:
1. 环境类(Context):环境类持有一个策略对象的引用,它将客户端的请求委派给策略对象进行处理。
2. 抽象策略类(Strategy):抽象策略类定义了一个公共接口,用于所有具体策略类的统一调用。
3. 具体策略类(Concrete Strategy):具体策略类实现了抽象策略类定义的接口,提供了具体的算法实现。
 
策略模式的优点包括:
1. 算法可以独立于客户端而变化,客户端可以根据需要选择不同的策略。
2. 策略类之间可以相互替换,增加新的策略也比较方便。
3. 可以避免使用大量的条件语句来判断不同的情况,提高代码的可读性和可维护性。
 
策略模式适用于以下场景:
1. 有多个类似的算法,需要动态选择其中一个时。
2. 需要在运行时根据不同的情况切换算法时。
3. 部分算法需要频繁变动或者扩展时。
 
总结起来,策略模式通过将算法封装成独立的策略类,使得算法可以相互替换,客户端可以根据需要选择不同的策略。这样可以提高代码的灵活性和可维护性,同时也符合面向对象设计的原则。

demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

import "fmt"

// 定义策略接口
type Strategy interface {
	Execute()
}

// 具体策略类A
type ConcreteStrategyA struct{}

func (s *ConcreteStrategyA) Execute() {
	fmt.Println("执行策略A")
}

// 具体策略类B
type ConcreteStrategyB struct{}

func (s *ConcreteStrategyB) Execute() {
	fmt.Println("执行策略B")
}

// 环境类
type Context struct {
	strategy Strategy
}

func (c *Context) SetStrategy(strategy Strategy) {
	c.strategy = strategy
}
func (c *Context) ExecuteStrategy() {
	c.strategy.Execute()
}
func main() {
	// 创建具体策略对象
	strategyA := &ConcreteStrategyA{}
	strategyB := &ConcreteStrategyB{}
	// 创建环境对象
	context := &Context{}
	// 设置策略A并执行
	context.SetStrategy(strategyA)
	context.ExecuteStrategy()
	// 设置策略B并执行
	context.SetStrategy(strategyB)
	context.ExecuteStrategy()
}

代码中定义了一个策略接口(Strategy),具体的策略类(ConcreteStrategyA和ConcreteStrategyB)实现了该接口的Execute方法。环境类(Context)包含一个策略接口类型的成员变量strategy,通过SetStrategy方法设置具体的策略对象,并通过ExecuteStrategy方法执行策略。

在主函数中,创建了具体的策略对象strategyA和strategyB,以及环境对象context。通过调用context的SetStrategy方法设置策略对象,然后调用ExecuteStrategy方法执行策略。输出结果为: 执行策略A 执行策略B

这个示例展示了策略模式的基本结构和使用方法。通过使用策略模式,我们可以将算法的实现与调用者解耦,使得算法可以独立于调用者而变化。同时,我们也可以动态地改变策略,提高代码的灵活性和可扩展性。