Go的策略模式

简介: 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装成独立的类,并使它们之间可以互相替换,从而使得算法可以独立于客户端而变化。

在策略模式中,有三个主要的角色:

  1. Context(上下文):它是包含策略的对象,负责将请求委派给具体的策略对象。
  2. Strategy(策略):它定义了一个接口或抽象类,用于封装具体算法的行为。
  3. Concrete Strategy(具体策略):它实现了策略接口,定义了具体的算法。

策略模式的核心思想是将不同的算法封装成独立的策略类,每个类负责处理特定的算法。上下文对象根据需要选择合适的策略对象来执行相应的算法。

策略模式的优点包括:

  1. 提供了一种灵活的方式来选择算法,使得算法可以独立于客户端而变化。
  2. 遵循开闭原则,新增策略不会修改现有的代码。
  3. 代码结构更清晰,各个策略可以独立进行单元测试。

然而,策略模式也有一些缺点:

  1. 增加了类的数量,特别是当策略较多时。
  2. 客户端需要了解不同的策略,可能增加了客户端的复杂性。
package main

import "fmt"

// PaymentStrategy 定义支付策略接口
type PaymentStrategy interface {
    Pay(amount float64)
}

// CashPaymentStrategy 现金支付策略
type CashPaymentStrategy struct{}

func (c *CashPaymentStrategy) Pay(amount float64) {
    fmt.Printf("支付了 %.2f 元现金\n", amount)
}

// CreditCardPaymentStrategy 信用卡支付策略
type CreditCardPaymentStrategy struct{}

func (c *CreditCardPaymentStrategy) Pay(amount float64) {
    fmt.Printf("支付了 %.2f 元信用卡\n", amount)
}

// PaymentContext 支付上下文对象
type PaymentContext struct {
    strategy PaymentStrategy
}

func (p *PaymentContext) SetStrategy(strategy PaymentStrategy) {
    p.strategy = strategy
}

func (p *PaymentContext) Pay(amount float64) {
    p.strategy.Pay(amount)
}

func main() {
    payment := &PaymentContext{}

    // 使用现金支付策略
    payment.SetStrategy(&CashPaymentStrategy{})
    payment.Pay(100.50)

    // 使用信用卡支付策略
    payment.SetStrategy(&CreditCardPaymentStrategy{})
    payment.Pay(200.75)
}
目录
相关文章
|
19天前
|
设计模式 算法 Go
[设计模式 Go实现] 行为型~策略模式
[设计模式 Go实现] 行为型~策略模式
|
11月前
|
设计模式 算法 Go
Go语言实现设计模式之策略模式
策略模式是一种常用的设计模式,它允许在运行时选择算法的行为。本文将详细介绍策略模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。文章将结合开发和生活中的示例,说明策略模式的应用场景。
134 0
|
设计模式 存储 算法
Go设计模式(20)-策略模式
策略模式可能是很多同学学习到的第一种模式。这个模式确实适合作为开篇模式来讲,主要原因在于该模式简单、纯粹、没有太多技巧,但是很好的表达出了设计模式的理念,让读者能够直观的感受到设计模式带来的好处。
|
设计模式 算法 Go
Go 设计模式-策略模式
Go 设计模式-策略模式
183 0
Go 设计模式-策略模式
|
3天前
|
Go 索引
Go 语言切片(Slice)
Go 语言切片(Slice)
9 1
|
3天前
|
存储 Go Python
Go 语言结构体
Go 语言结构体
6 0
|
3天前
|
存储 Go
Go 语言指针
Go 语言指针
7 0
|
3天前
|
JSON Java Go
使用go语言中的内置库调试性能
【5月更文挑战第21天】本文介绍Go 语言提供了内置的 expvar 模块来输出度量数据,帮助定位性能瓶颈。与 pprof 不同,expvar 专注于应用的宏观状态,通过 HTTP 接口 `/debug/vars` 提供标准的 JSON 格式数据,包括自定义度量和内存统计等。通过 expvar,开发者可以轻松监控应用状态,如消息处理速率、内存使用等,而无需像 C++ 或 Java 那样手动实现。
20 0
使用go语言中的内置库调试性能
|
4天前
|
编译器 Go 索引
Go 语言数组
Go 语言数组
9 1
|
4天前
|
Go CDN
Go 语言变量作用域
Go 语言变量作用域
14 4