当前位置: 首页 > article >正文

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

在这里插入图片描述


http://www.kler.cn/news/159757.html

相关文章:

  • Python学习路线 - Python语言基础入门 - 判断语句
  • 【langchain实战】开源项目-RasaGPT
  • 浏览器的favicon.icon 消失不见解决方案
  • 浏览器判断某一个 ip 是否与其在同一个局域网的几种方式
  • S120和PLC通讯设置
  • EDW国际数据管理最新趋势(二)|信息供应链与数据
  • 人类长寿新突破背后:“原知因”成为炙手可热新课题
  • heatmap.js热力图【vue3】
  • 【开题报告】基于SpringBoot的农场管理系统的设计与实现
  • 用OpenCV与MFC写一个图像格式转换及简单处理程序
  • Win11安装Docker
  • 【数据库】数据库多种锁模式,共享锁、排它锁,更新锁,增量锁,死锁消除与性能优化
  • 二叉树链式结构的实现——C语言
  • PG 常用维护性 SQL
  • git报错invalid object xxx和unable to read tree xxxxxx
  • 播放器开发(六):音频帧处理并用SDL播放
  • 三部曲法求未定式极限中的1无穷次方型
  • 【探索Linux】—— 强大的命令行工具 P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
  • 【教程】Conda更换镜像源安装pytorch
  • Git篇如何搭建自己的git仓库
  • 前端知识笔记(二十五)———JS中的异步编程与Promise
  • 如何给自己的网站加密
  • C++大小写字母转换
  • 【PID学习笔记 6 】控制系统的性能指标之二
  • Zookeeper 安装与部署
  • Java 中最常用的设计模式之一,工厂模式模式的写法,
  • 不同场景下如何构建高品质的SD-WAN网络?
  • 【libcurl库】安装及其编程访问百度首页(一)
  • threejs WebGLRenderer 像素比对画布大小的影响
  • 如何查看linux块大小