策略模式是一种行为设计模式,通过策略模式,可以在运行时修改一个对象的行为。很多资料里对它的定义是:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。
策略模式的实现代码
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.项目的准备工作
找到 go 的 GOPATH
$ go env		//可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹		-- 存放编译后的二进制文件
2.pkg文件夹		-- 存放编译后的库文件
3.src文件夹		-- 存放源码文件
2.创建文件夹
//	-- 在项目文件夹 strategic_mode 里创建新文件夹
//	strategic	-- 存放装饰者的全部文件

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())
}
终端输出

6.全部文件图











