《golang设计模式》第三部分·行为型模式-09-策略模式(Strategy)

文章目录

  • 1. 概述
    • 1.1 作用
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1. 概述

1.1 作用

策略(Strategy)是用于封装一组算法中单个算法的对象,这些策略可以相互替换,使得单个算法的变化不影响使用它的客户端。

1.1 角色

  • Context(环境角色):算法策略的上下文类,也是使用策略对象的客户类
  • Strategy(抽象策略):具体策略的抽象接口
  • ConcreteStrategy(具体策略):对应了环境各种算法,它是抽象策略的实现。

1.2 类图

Context
-strategy:Strategy
+Service()
«interface»
Strategy
+Behabior(con:Context)
ConcreteStrategyA
+Behabior(con:Context)
ConcreteStrategyB
+Behabior(con:Context)
ConcreteStrategyC
+Behabior(con:Context)

2. 代码示例

2.1 设计

  • 定义一个抽象策略
  • 定义两个具体策略
    • 它们实现了抽象策略
    • 它们拥有自己的算法
  • 定义一个环境类
    • 它有x、y两个成员
    • 它是策略的聚合,它有方法可以将具体策略加入聚合
    • 它的执行方法可以执行之前加入环境的策略组
    • 它有方法可以查询它自己
  • 调用
    • 实例化两个具体策略
    • 实例化一个环境,将两个策略加入环境(一个策略可以多次加入)
    • 调用环境的执行方法
    • 调用环境的查看方法验证结果

2.2 代码

  • 代码
package mainimport "fmt"// 定义抽象策略
type Strategy interface {Calculate(a, b int64) (x, y int64)
}// 定义具体策略
type AddStrategy struct{}// 该策略的计算方法(这里我们仅返回了环境的x、y值,你也可以如标准类图所示设计成返回环境类)
func (s *AddStrategy) Calculate(a, b int64) (x, y int64) {x = a + 10y = b + 10return x, y
}// 定义第二个具体策略
type SubStrategy struct{}//该策略的计算方法
func (s *SubStrategy) Calculate(a, b int64) (x, y int64) {x = a - 1y = b - 1return x, y
}// 定义环境类
type Context struct {strategyList []Strategyx            int64y            int64
}//创建环境类的函数(该函数为演示方便,和策略模式无关)
func CreateContext(x int64, y int64) *Context {c := &Context{x:            x,y:            y,strategyList: []Strategy{},}return c
}
//定义方法,为环境添加策略
func (c *Context) AddStrategy(s ...Strategy) {c.strategyList = append(c.strategyList, s...)
}//定义方法,执行环境拥有的各策略
func (c *Context) Execute() {for _, s := range c.strategyList {c.x, c.y = s.Calculate(c.x, c.y)}
}
//定义环境的查询方法
func (c *Context) Get() {fmt.Printf("====context===\n x: %d y:%d\n", c.x, c.y)
}func main() {//实例化两个策略addStrategy := &AddStrategy{}subStrategy := &SubStrategy{}//实例化环境context := CreateContext(200, 100)//将策略加入环境context.AddStrategy(addStrategy, subStrategy, subStrategy)//执行环境中各策略context.Execute()//查询环境状态验证结果context.Get()
}
  • 输出
====context===x: 208 y:108 

2.3 类图

Context
+strategyList:[]Strategy
+x:int64
+y:int64
+AddStrategy(s ...Strategy)
+Execute()
+Get()
«interface»
Strategy
+Calculate(a, b int64) (x, y int64)
AddStrategy
+Calculate(a, b int64) (x, y int64)
SubStrategy
+Calculate(a, b int64) (x, y int64)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师——程序设计语言基础(一)

📑前言 本文主要是【程序设计语言基础】——程序设计语言基础的相关题目,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#…

TA-Lib学习研究笔记——Overlap Studies(二)上

TA-Lib学习研究笔记——Overlap Studies(二) 1. Overlap Studies 指标 [BBANDS, DEMA, EMA, HT_TRENDLINE, KAMA, MA, MAMA, MAVP, MIDPOINT, MIDPRICE, SAR, SAREXT, SMA, T3, TEMA, TRIMA, WMA]2.数据准备 get_data函数参数(代码&#x…

UI自动化测试的正确姿势 —— Airtest设备连接API详解第一篇

一、背景 Airtest作为一款优秀的自动化测试工具,有着强大的API功能,处理日常自动化测试过程中需要的各类操作。今天就给大家逐一介绍关于设备连接和常用API部分,结合自动化测试中的各类需求,看看如何通过使用Airtest来快速实现。…

leetcode 15. 三数之和(优质解法)

代码&#xff1a; class Solution {public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;for(int i0;i<length-3;){int lefti1;int rightlength…

【论文学习】机器学习模型安全与隐私研究综述

机器学习在数据层、模型层以及应用层面临的安全和隐私威胁&#xff0c;呈现出多样性、隐蔽性和动态演化的特点。 应用领域&#xff1a;计算机视觉、自然语言处理、语音识别等 应用场景&#xff1a;自动驾驶、人脸识别、智慧医疗等 Key words: machine learning; poisoning atta…

设计模式之Strategy策略模式

Strategy策略模式 我的理解是在不同情况下使用不同方法&#xff0c;而方法可以增加&#xff0c;所以写一个方法父类&#xff0c;让所有方法继承下来&#xff0c;在子类写实现&#xff0c;添加时写新的子类就可以 动机 在软件构建过程中&#xff0c;某些对象使用的算法可能多…

【星火大模型】api使用

讯飞星火官方首页 准备工作 注册讯飞星火账号申请开发者api试用 从一个demo开始 讯飞星火官方的程序员为我们提供了非常优秀的demo&#xff0c;基本涵盖了大多数常用语言。 demo下载链接 这里我选用Java带上下文调用示例 下载后可以看到这是一个idea项目&#xff0c;直接…

2336. 无限集中的最小数字 : 容易又高效的分类做法

题目描述 这是 LeetCode 上的 「2336. 无限集中的最小数字」 &#xff0c;难度为 「中等」。 Tag : 「优先队列&#xff08;堆&#xff09;」、「哈希表」 现有一个包含所有正整数的集合 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestIn…

Python实现学生信息管理系统(详解版)

Python实现学生信息管理系统-详解版 个人简介实验名称&#xff1a;学生信息管理系统系统功能实验步骤详讲添加入住学生信息删除学生的住宿信息修改学生的住宿信息查询学生的住宿信息显示所有学生住宿信息显示所有请假学生的信息 运行截图展示1.主界面2.添加新的入住学生信息3.显…

Django路由分发

首先明白一点&#xff0c;Django的每一个应用下都可以有自己的templates文件夹&#xff0c;urls.py文件夹&#xff0c;static文件夹&#xff0c;基于这个特点&#xff0c;Django能够很好的做到分组开发&#xff08;每个人只写自己的app&#xff09;&#xff0c;作为老大&#x…

如何自定义spring-boot-starter

1. 创建自定义starter 1.1 生成Maven工程 mvn archetype:generate -DarchetypeGroupIdorg.apache.maven.archetypes -DarchetypeArtifactIdmaven-archetype-quickstart -DarchetypeVersion1.4交互式输入groupId、artificatId、version&#xff0c;生成Maven工程后用IDEA打开 …

详细学习Pyqt5中的2种弹簧

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

第十三章 python之爬虫

Python基础、函数、模块、面向对象、网络和并发编程、数据库和缓存、 前端、django、Flask、tornado、api、git、爬虫、算法和数据结构、Linux、设计题、客观题、其他 第十三章 爬虫 1. 写出在网络爬取过程中, 遇到防爬问题的解决办法。 在网络爬取过程中&#xff0c;可能会遇…

工业物联网数据传输方式探究

文章目录 引言Modbus RTU&#xff1a;传统数据采集的基础Modbus TCP&#xff1a;现代工业物联网的关键演进与影响 结语 引言 工业物联网的发展为工业数据采集带来了巨大的变革。从最初的 Modbus RTU 到现在广泛应用的 Modbus TCP&#xff0c;数据采集方式的演进使得工业领域的…

element ui 表格合计项合并

如图所示&#xff1a; 代码&#xff1a; <el-table height"400px" :data"tableData " borderstyle"width: 100%"stripe show-summaryref"table"id"table"> </el-table>监听表格 watch: { //监听table这个对象…

【LeeCode】54.螺旋矩阵

给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完所有元素。 示例 1&#xff1a;…

【华为数通HCIP | 网络工程师】821刷题日记-IS-IS(2)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

【面试】typescript

目录 为什么用TypeScript&#xff1f; TS和JS的区别 控制类成员可见性的访问关键字&#xff1f; public protected&#xff09;&#xff0c;该类及其子类都可以访问它们。 但是该类的实例无法访问。 私有&#xff08;private&#xff09;&#xff0c;只有类的成员可以访问…

Apache Flink(三):Flink核心特性及应用场景

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

三次握手和四次挥手

TCP 协议简述 TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接…