Template Methodパターンとは
Template Methodパターンは、テンプレートの機能をもつパターン。つまり処理の雛型(処理手順)をテンプレートに切り出し、各手順で行う具体的な処理を別クラスの実装に任せるパターンのこと。システムのフレームワークを構築するための手段として利用される。
Template Methodパターンを利用することで、下記のようなメリットを得ることができる。
- 一連の処理の手続きを共通化できるため抽象度が高まる。
クラス図

実装
インターフェース
package main
type Display interface {
Open()
Print()
Close()
}
テンプレート
package main
// 処理のテンプレートを定義している構造体。
// Displayインターフェースを実装した構造体を利用して一連の処理を実行する。
type TemplateDisplay struct {
display Display
}
func NewTemplateDisplay(d Display) *TemplateDisplay{
t := TemplateDisplay{display: d}
return &t
}
func (d *TemplateDisplay) Display() {
d.display.Open()
d.display.Print()
d.display.Close()
}
func (d *TemplateDisplay) DisplayFiveTimes() {
d.display.Open()
for i := 0; i < 5; i++ {
d.display.Print()
}
d.display.Close()
}
構造体
package main
import (
"fmt"
)
type CharDisplay struct {
ch rune
}
func NewCharDisplay(ch rune) *CharDisplay {
c := CharDisplay{ch: ch}
return &c
}
func (c *CharDisplay) Open() {
fmt.Print("<<")
}
func (c *CharDisplay) Print() {
fmt.Print(string(c.ch))
}
func (c *CharDisplay) Close() {
fmt.Println(">>")
}
package main
import (
"fmt"
)
type StringDisplay struct {
str string
}
func NewStringDisplay(str string) *StringDisplay {
s := StringDisplay{str: str}
return &s
}
func (s *StringDisplay) Open() {
fmt.Print("=")
}
func (s *StringDisplay) Print() {
fmt.Print(s.str)
}
func (s *StringDisplay) Close() {
fmt.Println("=")
}
動作確認
package main
func main() {
cd := NewTemplateDisplay(NewCharDisplay('a'))
sd := NewTemplateDisplay(NewStringDisplay("str"))
cd.Display()
sd.Display()
cd.DisplayFiveTimes()
sd.DisplayFiveTimes()
}
<<a>>
=str=
<<aaaaa>>
=strstrstrstrstr=
コメント