0
点赞
收藏
分享

微信扫一扫

Go 设计模式中策略模式


鱼弦:全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

 

Go 设计模式中策略模式_抽象类

 

在Go设计模式中,策略模式是一种行为型模式,用于在运行时选择算法的行为。策略模式将不同的算法封装成各自的策略对象,并使得这些策略对象可以互相替换,从而使得算法的选择可以独立于客户端而变化。

原理详细解释:

策略模式的核心思想是将不同的算法封装成独立的策略类,并使得这些策略类实现同一个接口或继承同一个抽象类。客户端可以根据需要选择不同的策略对象,而不需要了解具体算法的实现细节。

在策略模式中,通常有以下几个角色:

  1. Context(环境):环境类是使用策略的客户端,它持有一个策略对象的引用,并在运行时选择合适的策略对象来执行特定的算法。
  2. Strategy(策略接口或抽象类):策略接口或抽象类定义了一个公共的算法执行接口,具体的策略类需要实现该接口或继承该抽象类。
  3. ConcreteStrategy(具体策略类):具体策略类实现了策略接口或继承了策略抽象类,并实现了特定的算法逻辑。

通过将算法封装成不同的策略类,客户端可以在运行时动态地选择合适的策略对象,从而改变算法的行为。

底层结构图:

以下是策略模式的底层结构图:

+-----------------+
          |    Context      |
          +-----------------+
          | - strategy: Strategy |
          +-----------------+
                    |
                    | 1. ExecuteStrategy()
                    |
          +-----------------+
          |     Strategy    |
          +-----------------+
          | + Execute()     |
          +-----------------+
                    ^
                    |
          +-----------------+
          | ConcreteStrategyA |
          +-----------------+
          | + Execute()     |
          +-----------------+
                    ^
                    |
          +-----------------+
          | ConcreteStrategyB |
          +-----------------+
          | + Execute()     |
          +-----------------+

使用场景解释:

策略模式适用于以下情况:

  1. 当一个算法有多种实现方式时,并且需要在运行时动态地选择其中一种实现方式时。
  2. 当需要在不同的上下文环境中使用不同的算法,并且希望能够独立地对算法进行扩展和修改时。
  3. 当一个类的行为取决于多个条件语句时,可以使用策略模式将每个条件对应的行为封装成不同的策略类,提高代码的可读性和可维护性。

策略模式可以使算法的选择和使用与客户端代码解耦,使得代码更加灵活可扩展,并且符合面向对象设计的开闭原则。

代码示例实现:

下面是一个简单的策略模式的示例,假设有一个计算器对象,可以根据不同的操作(加法、减法、乘法)执行不同的计算算法:

package main

import "fmt"

// Strategy 策略接口
type Strategy interface {
	Execute(int, int) int
}

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

func (c *Context) SetStrategy(strategy Strategy) {
	c.strategy = strategy
}

func (c *Context) ExecuteStrategy(a int, b int) int {
	return c.strategy.Execute(a, b)
}

// ConcreteStrategyAdd 具体策略类:加法
type ConcreteStrategyAdd struct{}

func (s *ConcreteStrategyAdd) Execute(a int, b int) int {
	return a + b
}

// ConcreteStrategySub 具体策略类:减法
type ConcreteStrategySub struct{}

func (s *ConcreteStrategySub) Execute(a int, b int) int {
	return a - b
}

// ConcreteStrategyMul 具体策略类:乘法
type ConcreteStrategyMul struct{}

func (s *ConcreteStrategyMul) Execute(a int, b int) int {
	return a * b
}

func main() {
	// 创建环境对象
	context := &Context{}

	// 使用加法策略
	context.SetStrategy(&ConcreteStrategyAdd{})
	result := context.ExecuteStrategy(10, 5)
	fmt.Println("加法策略结果:", result)

	// 使用减法策略
	context.SetStrategy(&ConcreteStrategySub{})
	result = context.ExecuteStrategy(10, 5)
	fmt.Println("减法策略结果:", result)

	// 使用乘法策略
	context.SetStrategy(&ConcreteStrategyMul{})
	result = context.ExecuteStrategy(10, 5)
	fmt.Println("乘法策略结果:", result)
}

这个示例中,Strategy是策略接口,定义了一个Execute方法,具体的策略类ConcreteStrategyAddConcreteStrategySubConcreteStrategyMul分别实现了这个接口,并提供了不同的算法实现。Context是环境类,持有一个Strategy对象的引用,并在ExecuteStrategy方法中调用具体策略对象的Execute方法执行算法。

文献材料链接:

以下是一些关于策略模式的参考文献链接:

  1. Design Patterns: Elements of Reusable Object-Oriented Software - 这本书是设计模式的经典著作之一,详细介绍了策略模式以及其他设计模式的原理和实践。
  2. Strategy Pattern - Refactoring Guru - 这个网站提供了对策略模式的详细解释和示例,以及与其他设计模式的比较和应用场景。

当前都有哪些产品在使用:

策略模式是一种常用的设计模式,在软件开发中被广泛应用。许多开源库、框架和产品都使用了策略模式来实现灵活的算法选择和行为扩展。以下是一些常见的产品和框架,其中使用了策略模式或类似的思想:

  1. Go标准库(Standard Library):Go语言的标准库中使用了策略模式的思想,例如sort包中的排序算法可以通过实现不同的Interface来进行自定义排序。
  2. ORM框架:许多ORM(对象关系映射)框架,如GORM、XORM等,使用策略模式来支持不同的数据库方言和查询语法。
  3. 网络库:一些网络库,如net/http,提供了插件式的中间件机制,可以根据需要选择不同的中间件来处理请求和响应。
举报

相关推荐

0 条评论