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

本文介绍了如何使用策略模式在Golang中实现类似高德地图的导航功能,允许在运行时切换不同的导航策略,如步行、地铁和出租车。MapApp组件接收并设置不同策略对象,实现了策略的灵活性。
摘要由CSDN通过智能技术生成


十四、strategy 策略模式

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

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

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

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

14.1 map_app

├── mapapp.go
├── mapapp_test.go
└── navigate_strategy.go

14.1.1 map_app_test.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

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
}

14.1.3 navigate_strategy.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("出租车导航开始")
}
  • 26
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值