admin管理员组文章数量:1567750
文章目录
- 十四、strategy 策略模式
- 14.1 map_app
- 14.1.1 map_app_test.go
- 14.1.2 map_app.go
- 14.1.3 navigate_strategy.go
十四、strategy 策略模式
https://refactoringguru/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("出租车导航开始")
}
版权声明:本文标题:【设计模式】14、strategy 策略模式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725701551a1037532.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论