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