一、简介
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
模板模式有两大作用:复用和扩展。其中,复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。
二、优点
- 代码复用
- 统一算法框架
- 封装不变,扩展可变
三、适用场景
- 一次性实现算法的不变部分
- 集中公共行,避免代码重复
四、UML类图
五、案例
有下棋和足球两种游戏,它们的游玩过程类似,都是分为初始化、玩游戏、结束游戏三步。
go
package main
import "fmt"
type Game interface {
InitializeGame()
PlayGame()
EndGame()
}
func Play(game Game) {
game.InitializeGame()
game.PlayGame()
game.EndGame()
}
type Chess struct {
}
func NewChess() *Chess {
return &Chess{}
}
func (c *Chess) InitializeGame() {
fmt.Println("Initializing Chess Game")
}
func (c *Chess) PlayGame() {
fmt.Println("Playing Chess Game")
}
func (c *Chess) EndGame() {
fmt.Println("Ending Chess Game")
}
type Football struct {
}
func NewFootball() *Football {
return &Football{}
}
func (f *Football) InitializeGame() {
fmt.Println("Initializing Football Game")
}
func (f *Football) PlayGame() {
fmt.Println("Playing Football Game")
}
func (f *Football) EndGame() {
fmt.Println("Ending Football Game")
}
func main() {
chess := NewChess()
Play(chess)
football := NewFootball()
Play(football)
}