Goでデザインパターン (Template Methodパターン)

Goデザインパターン

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=

コメント

タイトルとURLをコピーしました