[英]How to implement Strategy Pattern in Go?
这是我要解决的一般问题:
这似乎是策略模式的完美案例,但不确定如何最好地在 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行为(接口)。 NoQuacking 、 LoudQuacking 、 ShyQuacking是实现 IQuack 接口的算法/具体行为。
因此,Duck 可以交替使用NoQuacking / loudQuacking / ShyQuacking算法来quack() 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.