行为型 模版模式

为什么需要模版模式

模版方法模式使用继承机制,把通用步骤和通用方法放到父类中,把具体实现延迟到子类中实现。使得实现符合开闭原则。模版模式经常用于各种框架,例如测试框架和servlet之类的,原理就是在一个父类先定义好行为,开放一些函数接口交给继承者实现,一旦继承者实现这些接口,使用者在调用父类的时候就可以直接按照既定设计使用。

模版模式还经常和callback的方式进行对比。callback一般是需要先注册,然后等待调用。而模版模式更加适合于流程比较明确的场景。

实现

在实现上面我们可以先定义一个interface,然后让一个struct匿名包含这个interface。需要注意的是如果interface的内容没有实现,会有nil pointer exception。所以在创建对象时候必须强制传入一个实现好interface的实例。

go.mod

module template

go 1.13

template.go

package template

type ExportedMethod interface {
	FormatMsg() string
	CheckList() bool
}

type NotificationCenter struct {
	ExportedMethod
}

func NewNotificationCenter(method ExportedMethod) *NotificationCenter {
	return &NotificationCenter{
		ExportedMethod: method,
	}
}

// NOTE: you shall not implement FormatMst() and CheckList()

func (noc *NotificationCenter) Send() string {
	if noc.CheckList() {
		return "Notification:" + noc.FormatMsg()
	}

	return "Nil"
}

type SMS struct {
}

func (sms *SMS) CheckList() bool {
	return true
}

func (sms *SMS) FormatMsg() string {
	return "SMS"
}

template_test.go

package template_test

import (
	"template"
	"testing"
)

func TestTemplate(t *testing.T) {
	noc1 := template.NewNotificationCenter(&template.SMS{})
	if noc1.Send() != "Notification:SMS" {
		t.Fatal(noc1.Send())
	}
}
Previous
Next