模板模式

优点

  1. 在方法中定义一套处理事务的通用逻辑(TemplateMethod),某些步骤交由子类实现。主要作用还是代码复用。
  2. 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现、
  3. 在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。
  4. 模板模式使得子类可以在不改变算法结构的基础上,重新具体定义算法中的某些步骤。
  5. 简而言之,完成一件事情,有固定的数个步骤,但是会有步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。固定不变的步骤可以抽取到父类中,需要变化的步骤定义为抽象方法由子类实现。
  6. 提高复用性,提高可扩展性,符合开闭原则

缺点

  1. 类数目增加
  2. 继承的缺点,如果父类添加了的新的抽象方法,所有子类都要修改

场景

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为被提取出来并集中到一个公共父类,从而避免代码重复

代码

在这里插入图片描述

package Template

import "fmt"

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

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

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

type Coder struct {
}

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

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

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

import "testing"

func TestWorker_Daily(t *testing.T) {
	worker:=NewWorker(&Coder{})
	worker.Daily()
}

其他设计模式