定义一个模板方法

type (
   BehaviorInterface interface {
      play()
   }
   AbstractStruct struct {
      ConcreteBehavior BehaviorInterface
   }
)

// 抽象方法需要调用具体实现
func (a AbstractStruct) play() {
   a.ConcreteBehavior.play()
   //fmt.Println("here is AbstractStruct.Play()")
}

func (a AbstractStruct) Run() {
   // 具体的方法
   a.pre()
   // 抽象方法
   a.play()
}

// 具体方法
func (a AbstractStruct) pre() {
   fmt.Println("before ")
}

定义一个实现结构体


type (
	Special struct{
		AbstractStruct
	}
)

func (s Special) play() {
	fmt.Println("here is Special.Play()")
}

使用

instance := &Special{}
instance.ConcreteBehavior = instance
instance.Run()

结语

以上只是核心部分,实际上入参添加上下文Context更好,再加上处理error的部分。

扩展:具体实例可以有多个,在Context里添加一个参数,校验通过后,映射具体的实例。