chiachan
chiachan
Published on 2020-08-19 / 687 Visits
0

Template模式(模板模式)

什么是模板模式?

  • 模板模式即将具体处理交给子类,在父类中定义处理流程的框架,在子类中实现具体处理。
  • 优点是在父类的模板方法中编写了算法,之后无需在每个子类中实现。

模板模式和桥接模式最大的区别

  • 模板模式每次都要去继承抽象类的功能,而桥接模式不需要。
  • 模板模式使用每次都需要New一个新对象,而桥接模式不需要。

示范代码(template.go)

package Template

import "fmt"

type WorkInterface interface {
	GetUp()
	Work()
	Sleep()
}

// 工作者
type Worker struct {
	WorkInterface
}

func NewWorker(w WorkInterface) *Worker {
	return &Worker{w}
}

func (w *Worker) Daily() {
	w.GetUp()
	w.Work()
	w.Sleep()
}

// 程序员
type Coder struct {
	Worker
}

func (c *Coder) GetUp() {
	fmt.Println("coder GetUp.")
}

func (c *Coder) Work() {
	fmt.Println("coder Coding.")
}

func (c *Coder) Sleep() {
	fmt.Println("coder Sleep.")
}

// 产品经理
type PM struct {
	Worker
}

func (p *PM) GetUp() {
	fmt.Println("pm GetUp.")
}

func (p *PM) Work() {
	fmt.Println("pm Working.")
}

func (p *PM) Sleep() {
	fmt.Println("pm Sleep.")
}

测试用例(template_test.go)

package Template

import (
	"fmt"
	"testing"
)

func TestNewWorker(t *testing.T) {
	// 程序员和产品经理都是工作者
	var worker1 *Worker = NewWorker(&Coder{})
	worker1.Daily()
	fmt.Println()
	var worker2 *Worker = NewWorker(&PM{})
	worker2.Daily()
}