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

news2024/11/26 23:23:32

文章目录

  • 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)

在这里插入图片描述

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

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

相关文章

C# API 文档自动生成器

文章目录 前言SandcastleDocFX 前言 最近要和别人交际,就要给API文档,但是感觉API文件手动写有点麻烦,想着怎么弄一个自动API文档生成 Sandcastle 折腾了两小时,好像不太好用 微软开源全新的文档生成工具DocFX DocFX 既然不好…

私域流量灵魂三问

私域流量灵魂三问: 1、是什么? 2、为什么做? 3、怎么做?

嵌入式LCD软件驱动流程与调试

前言 LCD屏在嵌入式中是应用比较广泛的,很多电子产品都是需要用到它来进行人机交互,那么工作中我们就少不了要对lcd进行软件驱动和调试。调试LCD需要掌握的学问有很多,没有一定的调试经验就很难对问题进行分析并解决。 博文推荐 LCD屏接口与…

网络协议系列:TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手 一. TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手前言TCP协议的介绍三次握手三次握手流程:1. A 的 TCP 向 B 发送 连…

LVS-NAT实验

实验前准备: LVS负载调度器:ens33:192.168.20.11 ens34:192.168.188.3 Web1节点服务器1:192.168.20.12 Web2节点服务器2:192.168.20.13 NFS服务器:192.168.20.14 客户端(win11…

速速报名!请查收 2023 龙蜥操作系统大会超全指南

亲爱的小伙伴们,大家好!我是大家的老朋友小龙!自 2023 龙蜥操作系统大会宣布启动以来,小龙收到了来自四面八方的诸多期待和小心心。首届龙蜥大会正如火如荼地进行中,为表示对关注社区的每一位小伙伴由衷的感谢&#xf…

排序算法基本原理及实现1

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 📑插入排序 &#x1f4…

人工智能即将彻底改变你使用计算机的方式

文章目录 每个人的私人助理“Clippy 是一个机器人,而不是特工。”卫生保健“一半需要心理健康护理的美国退伍军人没有得到治疗。”教育生产率娱乐和购物科技行业的冲击波技术挑战隐私和其他重大问题 今天我仍然像保罗艾伦和我创办微软时一样热爱软件。但是&#xff…

Linux系统之一次性计划任务at命令的基本使用

Linux系统之一次性计划任务at命令的基本使用 一、at命令介绍二、at命令的使用帮助2.1 at命令的help帮助信息2.2 at命令的语法解释 三、at命令的日常使用3.1 立即执行一次性任务3.2 指定时间执行一次性任务3.3 查询计划任务3.4 其他指定时间用法3.5 删除已经设置的计划任务3.6 显…

C语言——计算Fibonacci数列

方式一 for循环 (20位) #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int a[20]{1,1};for ( n 1; n <20; n){a[n]a[n-2]a[n-1];}for ( n 0; n < 20; n){if(n%50)printf("\n");printf("%12d ",a[n]);}return 0; …

【每日一题】无限集中的最小数字

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;有限集合方法二&#xff1a;有序集合 写在最后 Tag 【有序集合】【2023-11-29】 题目来源 2336. 无限集中的最小数字 题目解读 设计一个类实现移除无限集中的最小整数以及向该无限集中增加一个原集合中不存在的整数。…

【JavaEE初阶】 HTTP响应报文

文章目录 &#x1f332;序言&#x1f38d;200 OK&#x1f340;404 Not Found&#x1f384;403 Forbidden&#x1f334;405 Method Not Allowed&#x1f38b;500 Internal Server Error&#x1f333;504 Gateway Timeout&#x1f332;302 Move temporarily&#x1f38d;301 Move…

vs2012切换版本后WebUI项目加载失败,右键重新加载提示已经在解决方案中打开了具有该名称的项目

问题描述 vs2012切换版本后&#xff0c;回到主版本web项目加载失败&#xff0c;右键重新加载提示已经在解决方案中打开了具有该名称的项目 解决办法 打开根目录.csproj文件&#xff0c;找到第一个ProectTypeGuides节点&#xff0c;删除掉。然后关闭vs,重新打开此项目即可。这…

rust-flexi_logger

flexi_logger 是字节开源的rust日志库。目前有log4rs、env_log 等库&#xff0c;综合比较下来&#xff0c;还是flexi_logger简单容易上手&#xff0c;而且自定义很方便&#xff0c;以及在效率方面感觉也会高&#xff0c;下篇文章我们来测试下。 下面来看下怎么使用 关注 vx gol…

bugku题解记录2

文章目录 哥哥的秘密黄道十二官where is flag一段新闻 哥哥的秘密 给出了一个qq&#xff0c;那就去看看呗 hint里面说 收集空间信息——相册——收集微博信息——相册——解题——相册——提交flag 那看看空间先 盲文&#xff1a; hint&#xff1a;密码时地人 旗帜存在相册里…

Nature子刊最新研究:Hi-C宏基因组揭示土壤-噬菌体-宿主相互作用

土壤中有大量的噬菌体。然而&#xff0c;大多数宿主未知&#xff0c;无法获得其基因组特征。2023年11月23日&#xff0c;最新发表于《Nature communications》期刊题为“Hi-C metagenome sequencing reveals soil phage–host interactions”的文章&#xff0c;通过高通量染色体…

京东数据产品推荐-京东数据挖掘-京东平台2023年10月滑雪装备销售数据分析

如今&#xff0c;滑雪正成为新一代年轻人的新兴娱乐方式&#xff0c;借助北京冬奥会带来的发展机遇&#xff0c;我国冰雪经济已逐渐实现从小众竞技运动到大众时尚生活方式的升级。由此也带动滑雪相关生意的增长&#xff0c;从滑雪服靴到周边设备&#xff0c;样样都需要消费者掏…

基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程

基于EclipseSDKADTDDMS的安卓开发环境完整搭建过程 1 基本概念2 SDK安装3 Eclipse安装4 ADT插件安装4.1 在线安装&#xff08;太慢不建议选择&#xff09;4.2 离线安装&#xff08;建议选择&#xff09; 5 配置SDK6 集成安装7 创建安卓虚拟设备8 创建并启动安卓虚拟机8 关于DDM…

Zemax光学设计——单透镜设计

单透镜系统参数&#xff1a; 入瞳直径&#xff1a;20mm F/#&#xff08;F数&#xff09;&#xff1a;10 全视场&#xff1a;10 波长&#xff1a;587nm 材料&#xff1a;BK7 优化方向&#xff1a;最佳均方根光斑直径 设计步骤 一、单透镜系统参数 步骤一&#xff1a;入…

45、Flink 的指标体系介绍及验证(2)-指标的scope、报告、系统指标以及追踪、api集成示例和dashboard集成

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…