【设计模式】14、strategy 策略模式

文章目录

  • [十四、strategy 策略模式](#十四、strategy 策略模式)
    • [14.1 map_app](#14.1 map_app)
      • [14.1.1 map_app_test.go](#14.1.1 map_app_test.go)
      • [14.1.2 map_app.go](#14.1.2 map_app.go)
      • [14.1.3 navigate_strategy.go](#14.1.3 navigate_strategy.go)

十四、strategy 策略模式

https://refactoringguru.cn/design-patterns/strategy

需求: client 知道很多不同的策略, 希望在运行时切换.

场景示例: 就像高德地图一样, 导航到某地, 用户可选择其一: 地铁, 自驾, 打车, 自行车 等.

实现方式: 定义策略接口, 上层组合该接口. client 在运行时切换 具体策略.

14.1 map_app

bash 复制代码
├── mapapp.go
├── mapapp_test.go
└── navigate_strategy.go

14.1.1 map_app_test.go

go 复制代码
package _41map_app

import "testing"

func TestMapApp(t *testing.T) {
	app := MapApp{}

	app.SetNavigateStrategy(&WalkNavigateStrategy{})
	app.Run()

	app.SetNavigateStrategy(&SubwayNavigateStrategy{})
	app.Run()

	app.SetNavigateStrategy(&TaxiNavigateStrategy{})
	app.Run()
}

14.1.2 map_app.go

go 复制代码
package _41map_app

import "fmt"

type MapApp struct {
	navigateStrategy NavigateStrategy
}

func (app *MapApp) Run() {
	fmt.Println("打开导航地图APP")
	app.navigateStrategy.Navigate()
	fmt.Println("关闭导航地图APP")
}

func (app *MapApp) SetNavigateStrategy(s NavigateStrategy) {
	app.navigateStrategy = s
}
go 复制代码
package _41map_app

import "fmt"

type NavigateStrategy interface {
	// Navigate 导航
	Navigate()
}

type WalkNavigateStrategy struct {
}

func (s *WalkNavigateStrategy) Navigate() {
	fmt.Println("步行导航开始")
}

type SubwayNavigateStrategy struct {
}

func (s *SubwayNavigateStrategy) Navigate() {
	fmt.Println("地铁导航开始")
}

type TaxiNavigateStrategy struct {
}

func (s *TaxiNavigateStrategy) Navigate() {
	fmt.Println("出租车导航开始")
}
相关推荐
牛奶咖啡134 小时前
学习设计模式《二十三》——桥接模式
学习·设计模式·桥接模式·认识桥接模式·桥接模式的优点·何时选用桥接模式·桥接模式的使用示例
左灯右行的爱情4 小时前
深度学习设计模式:责任链(Chain of Responsibility)模式(例子+业务场景+八股)
深度学习·设计模式·责任链模式
是2的10次方啊4 小时前
🚀 Spring设计模式大揭秘:23种模式藏在你每天在用的框架里
设计模式
东北南西4 小时前
设计模式-单例模式
前端·javascript·单例模式·设计模式
快乐非自愿6 小时前
掌握设计模式--命令模式
设计模式·命令模式
我希望的一路生花15 小时前
Nik Collection 6.2全新版Nik降噪锐化调色PS/LR插件
人工智能·计算机视觉·设计模式·stable diffusion·aigc
东北南西20 小时前
设计模式-工厂模式
前端·设计模式
JohnYan21 小时前
工作笔记 - 改进的单例应用
javascript·设计模式·bun
郝学胜-神的一滴1 天前
使用C++11改进工厂方法模式:支持运行时配置的增强实现
开发语言·c++·程序人生·设计模式
Leo来编程1 天前
设计模式3-模板方法模式
设计模式·模板方法模式