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

文章目录

  • [1. 概述](#1. 概述)
    • [1.1 作用](#1.1 作用)
    • [1.1 角色](#1.1 角色)
    • [1.2 类图](#1.2 类图)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 设计](#2.1 设计)
    • [2.2 代码](#2.2 代码)
    • [2.3 类图](#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 代码

  • 代码
go 复制代码
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()
}
  • 输出
shell 复制代码
====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)


相关推荐
ZGIAI2 小时前
ZGI Workflow 并发控制:保护下游接口
人工智能·架构
ZGIAI2 小时前
知识库有结果,不等于召回率合格
人工智能·架构
爱学习的小邓同学3 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
老郑聊AI业财智造3 小时前
从“数字影子”到“智能共生体”:数字孪生的架构演进与产业落地全景剖析
架构
网安蟹佬霸4 小时前
WAF绕过技术实战:从规则检测到编码绕过全指南(2026最新版,附Payload集与自动化脚本)
运维·安全·网络安全·架构·自动化·网安
国科安芯5 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
云上工程笔记6 小时前
RDMA 高速互联 GPU 云怎么选:多卡训练、分布式训练与 RoCE/InfiniBand 架构对比
架构·云计算·gpu算力
这个DBA有点耶7 小时前
GaussDB和金仓KingbaseES本质差异:技术路线、Oracle兼容度、适用场景全解析
数据库·oracle·架构
Python私教7 小时前
软件开发报价差 3 倍,真正的工程冲突不在价格
后端·架构