首页 > 其他分享 >16 策略模式 -- go语言设计模式

16 策略模式 -- go语言设计模式

时间:2023-08-17 23:03:58浏览次数:52  
标签:nike -- fmt float64 strategic 16 设计模式 price

策略模式是一种行为设计模式,通过策略模式,可以在运行时修改一个对象的行为。很多资料里对它的定义是:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。

策略模式的实现代码

package main

import "fmt"

/*
	练习:
	商场促销有策略A(0.8折)策略B(消费满200,返现100),用策略模式模拟场景
 */

//销售策略
type SellStrategy interface {
	//根据原价得到售卖价
	GetPrice(price float64)	 float64
}

type StrategyA struct {}

func (sa *StrategyA) GetPrice(price float64) float64 {
	fmt.Println("执行策略A, 所有商品打八折")
	return price * 0.8;
}

type StrategyB struct {}

func (sb *StrategyB) GetPrice(price float64) float64 {
	fmt.Println("执行策略B, 所有商品满200 减100")

	if price >= 200 {
		price -= 100
	}

	return price;
}

//环境类
type Goods struct {
	Price float64
	Strategy SellStrategy
}

func (g *Goods) SetStrategy(s SellStrategy) {
	g.Strategy = s
}

func (g *Goods) SellPrice() float64 {
	fmt.Println("原价值 ", g.Price , " .")
	return g.Strategy.GetPrice(g.Price)
}

func main() {
	nike := Goods{
		Price: 200.0,
	}
	//上午 ,商场执行策略A
	nike.SetStrategy(new(StrategyA))
	fmt.Println("上午nike鞋卖", nike.SellPrice())

	//下午, 商场执行策略B
	nike.SetStrategy(new(StrategyB))
	fmt.Println("下午nike鞋卖", nike.SellPrice())
}

终端输出

1.png

策略模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 strategic_mode 里创建新文件夹

//	strategic	-- 存放装饰者的全部文件

2.png

3.接口文件 -- strategic文件夹

文件1 -- sellstrategy.go

package strategic

//销售策略
type SellStrategy interface {
	//根据原价得到售卖价
	GetPrice(price float64)	 float64
}

4.结构体文件 -- strategic文件夹

文件1 -- strategya.go

package strategic

import "fmt"

type StrategyA struct {}

func (sa *StrategyA) GetPrice(price float64) float64 {
	fmt.Println("执行策略A, 所有商品打八折")
	return price * 0.8;
}

文件2 -- strategyb.go

package strategic

import "fmt"

type StrategyB struct {}

func (sb *StrategyB) GetPrice(price float64) float64 {
	fmt.Println("执行策略B, 所有商品满200 减100")

	if price >= 200 {
		price -= 100
	}

	return price;
}

文件3 -- goods.go

package strategic

import "fmt"

//环境类
type Goods struct {
	Price float64
	Strategy SellStrategy
}

func (g *Goods) SetStrategy(s SellStrategy) {
	g.Strategy = s
}

func (g *Goods) SellPrice() float64 {
	fmt.Println("原价值 ", g.Price , " .")
	return g.Strategy.GetPrice(g.Price)
}

5.主文件 -- main.go 在项目文件夹

package main

import (
	"design/strategic_mode/strategic"
	"fmt"
)

func main() {
	nike := strategic.Goods{
		Price: 200.0,
	}
	//上午 ,商场执行策略A
	nike.SetStrategy(new(strategic.StrategyA))
	fmt.Println("上午nike鞋卖", nike.SellPrice())

	//下午, 商场执行策略B
	nike.SetStrategy(new(strategic.StrategyB))
	fmt.Println("下午nike鞋卖", nike.SellPrice())
}

终端输出

3.png

6.全部文件图

4.png

标签:nike,--,fmt,float64,strategic,16,设计模式,price
From: https://blog.51cto.com/u_14483476/7128228

相关文章

  • 【问题】分布式事务的场景下如何保证读写分离的数据一致性
    我的理解这个题目可以获得以下关键字:分布式处理、读写分离、数据一致性。那么就从”读写分离“做切入口吧,按我的理解其实就是在保证数据一致性的前提下两个(或以上)的数据库分别肩负不同的数据处理任务。太过久远的就不说了,最近几年其实都用的MySQL比较多。那么就基于MySQL我用......
  • Python 如何打印方框 文本对齐 分隔线
    以下代码的打印效果如下:在部分python程序中,我们需要通过用户输入进行交互,打印一些提示消息辅助用户做选择是必要的。以下代码打印了一个指定宽度的方框,在方框内给出的用户输入的选择提示。fromDebugInfo.DebugInfoimport*#创建一个白板,并准备一个表格白板=调试模板()......
  • 约数总结
    试除法求约数方法1-试除所有数算法原理假设p是x的一个约数,那么x/p一定也是它的约数,所以只需枚举2到$\sqrt[2]{n}$的约数,并且可以直接通过运算获得$\sqrt[2]{n}$之后对应的那个约数时间复杂度$O(\sqrt{n})$代码实现#include<iostream>#include<algorithm>#include<......
  • 约数总结
    试除法求约数方法1-试除所有数算法原理假设p是x的一个约数,那么x/p一定也是它的约数,所以只需枚举2到$\sqrt[2]{n}$的约数,并且可以直接通过运算获得$\sqrt[2]{n}$之后对应的那个约数时间复杂度$O(\sqrt{n})$代码实现#include<iostream>#include<algorithm>#include<......
  • 关于Mybatis 和 Hibernate 持久层框架之间的区别
    首先,Mybatis和Hibernate都是ORM持久层框架不同点在于,MyBatis是半自动的,它需要开发人员自己手动编写SQL语句。一、MybatisMyBatis支持通过XML或注解的方式来配置需要运行的SQL语句,并且,最终由框架本身将Java对象和SQL语句映射生成最终执行的SQL,执行后,再将结果映射......
  • 星瑞格数据库介绍
    随着数字化时代的到来,数据已成为企业发展的核心资产之一。数据库作为存储、管理和查询数据的重要工具,在企业信息化建设中扮演着至关重要的角色。本文将介绍星瑞格数据库,分析其在企业中的应用场景和未来发展趋势。星瑞格数据库概述星瑞格数据库是一种高性能、高可用、可扩展的分布......
  • 七月学习之Firewalld富规则策略
    7、Firewalld富规则策略7.1、Rule基本介绍firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置优先级在所有的防火墙策略中也是最高的7.2、Rule命令语法#富规则相关命令--add-rich-rule='<RU......
  • 抖音取图表情包小程序+创作者入驻+流量主
    这是一款抖音快手等多短头像壁纸表情包取图小程序源码支持创作者入驻和流量主功能的小程序源码,整活网友们从李总(别问是谁,小程序圈里的“名人”)那搞来的开源版壁纸类小程序,搭建比较复杂,小编也没编译过的go语言文件,这个只能大家自行去尝试研究了,其他功能也不多做赘述了,该有的它都有。......
  • #yyds干货盘点# LeetCode程序员面试金典:存在重复元素 II
    题目:给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i]==nums[j] 且 abs(i-j)<=k 。如果存在,返回 true ;否则,返回 false 。 示例 1:输入:nums=[1,2,3,1],k=3输出:true示例2:输入:nums=[1,0,1,1],k=1输出......
  • #yyds干货盘点# LeetCode程序员面试金典:组合和四
    1.简述:给你一个由 不同 整数组成的数组 ,和一个目标整数 。请你从 中找出并返回总和为 的元素组合的个数。numstargetnumstarget题目数据保证答案符合32位整数范围。 示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)......