《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 main

import "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 + 10
	y = b + 10
	return x, y
}

// 定义第二个具体策略
type SubStrategy struct{}

//该策略的计算方法
func (s *SubStrategy) Calculate(a, b int64) (x, y int64) {
	x = a - 1
	y = b - 1
	return x, y
}

// 定义环境类
type Context struct {
	strategyList []Strategy
	x            int64
	y            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)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…

Python数据分析从入门到进阶:模型评估和选择(含代码)

引言 之前我们介绍了机器学习的一些基础性工作,介绍了如何对数据进行预处理,接下来我们可以根据这些数据以及我们的研究目标建立模型。那么如何选择合适的模型呢?首先需要对这些模型的效果进行评估。本文介绍如何使用sklearn代码进行模型评估…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展,简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习(parallel federated learning,PFL),通过调换中心节点聚合和广播的顺序。本文…

W11安装mysql8详细保姆篇

一、MySQL的下载 目前官方最新版本是8.0.34,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。MySQL官方下载链接:MySQL官网下载 二、MySQL的安装 1、右击下载完成的安装包 2、点击Custom >> Next 3、…

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录 刷题前唠嗑题目:确定两个字符串是否接近题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode?启动!!! 刷完今天,我的每日一题就坚持一个月啦,月度勋章要到手啦 今早很尴尬,…

【C++】POCO学习总结(八):通知Notifications和事件Events

【C】郭老二博文之:C目录 1、Notifications和Events的区别 1)通知Notifications:如果观察者不知道或不关心事件的来源,则使用通知Notifications。 Poco::NotificationCenter或Poco::NotificationQueue位于源source和目标target之…

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档: 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了,a值还没有变1就被使用输出&#xff0…

BLP9H10-30GZ LDMOS 功率晶体管 Ampleon

BLP9H10-30GZ 30W塑料LDMOS 功率晶体管,适用于频率范围为616 MH 至960 MHz的基站应用。 BLP9H10-30GZ 特点和优势: 高效率 出色的耐用性 专为宽带操作而设计 出色的热稳定性 高功率增益 集成ESD保护 有关 RoHS 合规性 BLP9H10-30GZ应用程序&…

上海震坤行被评为虹桥生产线互联网服务高质量发展平台

上海震坤行被评为虹桥生产线互联网服务高质量发展平台 10月12日,新一期“潮涌浦江投资虹桥”活动暨“战略赋能新机遇,开放引领新高地”——2023虹桥国际中央商务区投资促进大会在上海虹桥举行。 本次活动旨在释放关于推动虹桥国际开放枢纽进一步提升能级…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

东明石化集团领导团队参访震坤行工业超市

东明石化集团领导团队参访震坤行工业超市 10月16日,山东东明石化集团(以下简称东明石化)总裁李治先生一行带队来访参观交流震坤行,与震坤行工业超市董事长兼CEO陈龙、销售负责团队开展座谈。期间,双方就企业数字化转型…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境,请阅读另外一篇博文: C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中,我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器,每当浏览器向 Web 服务器发送请求,我们将 HTML/CSS 文件提供给浏览器。 使用…

[Linux] linux防火墙

一、防火墙是什么 防火墙(FireWall):隔离功能,工作在网络或主机的边缘,数据包的匹配规则与由一组功能定义的操作组件处理的规则相匹配,根据特定规则检查网络或主机的入口和出口 当要这样做时,基…

EXCEL一对多关系将结果合并到一个单元格

EXCEL一对多关联结果,合并到1个单元格,变成一对一 需求说明 举例说明 假设给出国家省和国家市的对应表,因为每个省都有很多个城市(如图1,截取了部分),属于一对多的情况; 如何将同…

数据清洗和特征工程的关系是什么?有什么区别?

1.数据清洗独立于特征工程 数据清洗是独立于特征工程的:一方面,数据清洗不仅适用于机器学习项目,也适用于一般的数据统计分析过程,而特征工程仅适用于机器学习项目;另一方面,针对机器学习项目,…

小程序云开发中引入vant

首先看一下云开发中的小程序的目录结构 安装 vant 上面是官方的方法 具体到我们的项目是这样子的 最后,构建一下就可以了

Stable Video Diffusion(SVD)参数使用教程

Stable Video Diffusion(SVD)安装和测试 官网 github | https://github.com/Stability-AI/generative-modelsHugging Face | https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xtPaper | https://stability.ai/research/stable-vid…