首页 > 其他分享 >Go 设计模式中策略模式

Go 设计模式中策略模式

时间:2023-09-03 21:34:59浏览次数:33  
标签:Execute 策略 int +-----------------+ 模式 Strategy 算法 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,提供了插件式的中间件机制,可以根据需要选择不同的中间件来处理请求和响应。

标签:Execute,策略,int,+-----------------+,模式,Strategy,算法,Go,设计模式
From: https://blog.51cto.com/chenfenglove/7343336

相关文章

  • Go 设计模式中访问者模式
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)在Go设计模式中,访问者模式(VisitorPattern)是一种行为型模式,用于将算法与数据结构分离,使得算法可以独立地操作数据结构的不同元素,同时遵循......
  • MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备
    以后会争取每天一段感悟,不讨论对错,幼儿园的孩子才每件事论对错最强大的,这个词不一定是个好词,最强大的往往是最虚弱的,那些天天和你谈格局,谈奉献,谈爱,强大的人,很可能内心和垃圾堆里面的碎玻璃一样,闪闪发光。如何和这样的人交往呢,一定要把自己碎的更厉害,发出耀眼的光,此刻他就不和你谈格......
  • c++单例模式总结
    分类懒汉式:实例对象在第一次被使用时才进行初始化。饿汉式:实例在定义时就被初始化。特点1、构造函数和析构函数私有化,不允许外部创建实例对象。2、拷贝构造函数和复制运算符重载被delete,不允许产生新的实例。3、内部定义一个私有的静态数据成员,该成员为本类的实例化对象。4......
  • 基于状态模式: 没有实践,再多的理论都是扯淡!!!
    基于状态模式:没有实践的理论都是扯淡!!!定义状态模式是一种面向对象的设计模式,它允许一个对象在其内部状态改变时改变它对应的行为。状态模式的关键在于如何区分事物内部的状态,事物内部状态的改变往往会带来事物的行为的改变。通常我们谈到封装,一般都会优先封装对象的行为(比如,某个函......
  • Google C++编程规范(Google C++ Style Guide)
    参考链接:Google代码规范C++总结Google开源项目风格指南——中文版GoogleC++StyleGuide是一份不错的C++编码指南,我制作了一张比较全面的说明图,可以在短时间内快速掌握规范的重点内容。不过规范毕竟是人定的,记得活学活用。看图前别忘了阅读下面两条重要建议:保持一致也......
  • 2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数
    2023-09-03:用go语言编写。给你一个n个节点的无向无根树,节点编号从0到n-1给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节......
  • 2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数
    2023-09-03:用go语言编写。给你一个n个节点的无向无根树,节点编号从0到n-1给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1......
  • 设计模式:通俗易懂版
    ......
  • 两个例子理解js设计模式中的【适配器模式】
    适配器模式的精髓:如果现有的接口已经能够正常工作,那我们就永远不会用上适配器模式。适配器模式是一种“亡羊补牢”的模式,没有人会在程序的设计之初就使用它。因为没有人可以完全预料到未来的事情,也许现在好好工作的接口,未来的某天却不再适用于新系统,那么我们可以用适配器模式把旧......
  • 基于Hugo的github个人博客的搭建
    一、前期准备以windows系统为例1.下载Git(https://git-scm.com/downloads)2.下载Hugo(https://github.com/gohugoio/hugo/releases)按照自己电脑下。3.设置环境变量:打开环境变量可以看到在系统变量有一个变量名为PATH的变量,直接点击然后编辑,把自己的git和hugo的位置添加进去。注意不是......