策略模式

54 阅读1分钟

定义为 定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码

工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。接下来,我就详细讲讲一个完整的策略模式应该包含的这三个部分

// 1.策略的定义
type IStrategy interface {
   do()
}

type AStrategy struct {
}

func (a *AStrategy) do() {
   fmt.Println("AStrategy")
}

type BStrategy struct {
}

func (b *BStrategy) do() {
   fmt.Println("BStrategy")
}

type CStrategy struct {
}

func (c *CStrategy) do() {
   fmt.Println("CStrategy")
}

// 一般策略根据参数type来创建,为了封装创建逻辑,向客户端屏蔽创建细节,可以把创建逻辑放在工厂类
type StrategyFactory struct {
   m map[string]IStrategy
}

func GetFactory() (s *StrategyFactory) {
   s = &StrategyFactory{}
   s.m = make(map[string]IStrategy)
   s.m["a"] = new(AStrategy)
   s.m["b"] = new(BStrategy)
   return
}
func (s *StrategyFactory) GetStrategy(typ string) IStrategy {
   return s.m[typ]
}

//3策略的使用,运行时动态确定
func TestStrategy1(t string) {
   f := GetFactory()
   s := f.GetStrategy(t)
   s.do()
}

一般来讲,如果策略类是无状态的,不包含成员变量,只是纯粹的算法实现,这样的策略对象是可以被共享使用的,不需要在每次调用 getStrategy() 的时候,都创建一个新的策略对象,上面的实现就是如此