2013-07-22 57 views
5

这里是我试图解决的普遍问题:如何在Go中实施策略模式?

  1. 一组包从一个源收集数据并将其发送到多个通道。
  2. 第二套软件包正在收集来自多个通道的数据并将其写入一个源。这套软件包需要翻译多种格式的数据。

这似乎是策略模式的完美案例,但我不确定如何在Go中做出最好的工作。

回答

11

一般而言;不要迷失在构建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() 
} 

…给你的工作人员。

+0

优秀的答案,谢谢!没有那么多迷失在模式中,因为我知道这是一个以某种方式解决的问题。再次感谢。 – KevDog

+1

但是如何动态加载策略?如果我需要根据站点中的配置加载策略,那么这是如何完成的?从我看到的无法在golang中动态加载包的方式。还是有另一种方式? – Madhan

+1

@Madhan使用switch语句。 – thwd