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)
}
目录
相关文章
|
3月前
|
设计模式 算法 测试技术
动态支付策略:Go 语言中策略模式的妙用
动态支付策略:Go 语言中策略模式的妙用
|
3月前
|
缓存 算法 Go
|
6月前
|
设计模式 算法 Go
[设计模式 Go实现] 行为型~策略模式
[设计模式 Go实现] 行为型~策略模式
|
设计模式 算法 Go
Go语言实现设计模式之策略模式
策略模式是一种常用的设计模式,它允许在运行时选择算法的行为。本文将详细介绍策略模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。文章将结合开发和生活中的示例,说明策略模式的应用场景。
208 0
|
设计模式 存储 算法
Go设计模式(20)-策略模式
策略模式可能是很多同学学习到的第一种模式。这个模式确实适合作为开篇模式来讲,主要原因在于该模式简单、纯粹、没有太多技巧,但是很好的表达出了设计模式的理念,让读者能够直观的感受到设计模式带来的好处。
|
设计模式 算法 Go
Go 设计模式-策略模式
Go 设计模式-策略模式
206 0
Go 设计模式-策略模式
|
5天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
93 65
|
5天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
26 13
|
1天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
8 4
|
1天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
10 4