Template MethodパターンとStarategyパターンについて

GoF行動パターンTemplate MethodとStrategyの違い、大枠処理の継承と戦略切り替えパターンの実装と使い分け

Read in: en
Template MethodパターンとStarategyパターンについて

概要

GoFの振る舞いに関するパターンであるTemplate MethodパターンとStrategyパターンについてまとめる。

Template Methodパターンとは

大枠の処理を上位のクラスで決めておき、具体的な処理の流れを下位のクラスに任せる設計パターン。

package main

type Game interface {
	Init()
	Start()
	End()
}

type BaseBall struct{}

func (b *BaseBall) Init() {
	println("BaseBall Init")
}

func (b *BaseBall) Start() {
	println("BaseBall Start")
}

func (b *BaseBall) End() {
	println("BaseBall End")
}

func (b *BaseBall) Play() {
	b.Init()
	b.Start()
	for i := 0; i < 9; i++ {
		println("Top & Bottom")
	}
	b.End()
}

func main() {
	b := &BaseBall{}
	b.Play()
}

Strategyパターンとは

実行時に処理を選択することができるような設計パターン。

Templateパターンと似ているが、Strategyパターンは処理の全てをまとめて切り替えるような構成で、Templateパターンは特定の処理は固定で他が可変といったイメージ。

package main

type PaymentStrategy interface {
	Pay(amount int)
}

type CreditCard struct{}

func (cc *CreditCard) Pay(amount int) {
	println("CreditCard Pay")
}

type Cash struct{}

func (c *Cash) Pay(amount int) {
	println("Cash Pay")
}

type Cart struct {
	paymentMethod PaymentStrategy
}

func (c *Cart) Checkout(amount int) {
	c.paymentMethod.Pay(amount)
}

func main() {
	cc := &CreditCard{}
	c := &Cash{}

	cart := &Cart{paymentMethod: cc}
	cart.Checkout(100)

	cart.paymentMethod = c
	cart.Checkout(100)
}

Template MethodパターンもStrategyパターンも継承を使うか委譲を使う方は実装に任させれているので、どちらを使わないといけないということはない。

参考

Tags: Strategy Template Method
Share: 𝕏 Post Facebook Hatena
✏️ View source / Discuss on GitHub
☕ サポート

このブログを応援していただける方は、以下からサポートをお願いします。いただいたサポートはブログ運営・技術研鑽に活用します。


関連記事