模版模式 (Template Pattern) 定义一个操作中算法的骨架,而将一些步骤延迟到子类中。这种方法让子类在不改变一个算法结构的情况下,就能重新定义该算法的某些特定步骤。
简单来说,模板模式就是将一个类中能够公共使用的方法放置在抽象类中实现,将不能公共使用的方法作为抽象方法,强制子类去实现,这样就做到了将一个类作为一个模板,让开发者去填充需要填充的地方。
以下是模板模式的一个实现:
package template
import "fmt"
// 社畜接口
type CompanySlave interface {
GoToWork()
AtWork()
GoOffWork()
}
type Programmer struct {
}
func (Programmer) GoToWork() {
fmt.Println("地铁上班")
}
func (Programmer) GoOffWork() {
fmt.Println("地铁下班")
}
func (Programmer) AtWork() {
// 交给具体子类实现
}
func oneDay(cs CompanySlave) {
cs.GoToWork()
cs.AtWork()
cs.GoOffWork()
}
type XiaoMing struct {
Programmer
}
type XiaoHong struct {
Programmer
}
func (* XiaoMing) AtWork() {
fmt.Println("干到头秃")
}
func (* XiaoHong) AtWork() {
fmt.Println("偷偷摸鱼")
}
这里来看下测试用例:
package template
import (
"fmt"
"testing"
)
func TestTemplate(t *testing.T) {
fmt.Println("小红的一天")
xiaohong := &XiaoHong{}
oneDay(xiaohong)
fmt.Println("=====>")
fmt.Println("小明的一天")
xiaoming := &XiaoMing{}
oneDay(xiaoming)
}