繁体   English   中英

如何在 Go 中实现策略模式?

[英]How to implement Strategy Pattern in Go?

这是我要解决的一般问题:

  1. 一组包从一个来源收集数据并将其发送到多个渠道。
  2. 第二组包是从许多渠道收集数据并将其写入一个源。 这组包需要翻译多种格式的数据。

这似乎是策略模式的完美案例,但不确定如何最好地在 Go 中发挥作用。

一般来说; 不要迷失在构建 Go 应用程序的模式和协议中。 该语言使其易于表达和直截了当。 大多数情况下,定义可靠的接口使一切都足够灵活。

不过,这里有一个 Go 中策略模式的例子:

为策略的行为定义一个接口:

type PackageHandlingStrategy interface {
    DoThis()
    DoThat()
}

实施该策略:

type SomePackageHandlingStrategy struct {
    // ...
}

func (s *SomePackageHandlingStrategy) DoThis() {
    // ...
}

func (s *SomePackageHandlingStrategy) DoThat() {
    // ...
}

然后,要么嵌入......

type PackageWorker struct {
    SomePackageHandlingStrategy
}

func (w *PackageWorker) Work() {
    w.DoThis()
    w.DoThat()
}

……或者通过策略……

type PackageWorker struct {}

func (w *PackageWorker) Work(s PackageHandlingStrategy) {
    s.DoThis()
    s.DoThat()
}

……给你的工人。

@madhan 您可以制作策略工厂。 然后从配置中传递策略名称,工厂将创建您需要的策略实例。 工厂可以用 switch 或 map[string]Strateger 实现。

请参阅下面的另一个示例。

// Duck embeds IQuack interface
// Client for IQuack behavior
type Duck struct {
    IQuack
}

// IQuack is interface for quacking behavior (Behavior)
type IQuack interface {
    Quack() string
}

// NoQuacking implements IQuack interface and does not quack.
// Concrete Behavior
type NoQuacking struct{}

// Quack returns "I cannot Quack"
func (i NoQuacking) Quack() string {
    return "I cannot Quack :("
}

// LoudQuacking implements IQuack interface and is for ducks that quack loudly.
// Concrete Behavior
type LoudQuacking struct{}

// Quack returns "I Quack loudly"
func (i LoudQuacking) Quack() string {
    return "I Quack loudly!!"
}

// ShyQuacking implements IQuack interface and is for ducks that are shy.
// Concrete Behavior
type ShyQuacking struct{}

// Quack returns "I do a shy quack"
func (i ShyQuacking) Quack() string {
    return "I do a shy quack :)"
}

func main() {
    rubberDuck := Duck{NoQuacking{}}
    fmt.Println(rubberDuck.Quack)

    wildDuck := Duck{LoudQuacking{}}
    fmt.Println(wildDuck.Quack)
}

在示例中, Duck是客户端。

它有一个IQuack行为(接口)。 NoQuackingLoudQuackingShyQuacking是实现 IQuack 接口的算法/具体行为。

因此,Duck 可以交替使用NoQuacking / loudQuacking / ShyQuacking算法来quack()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM