0
点赞
收藏
分享

微信扫一扫

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

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

策略模式的实现代码

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

举报

相关推荐

0 条评论