GoFの振る舞いに関するパターンであるTemplate MethodパターンとStrategyパターンについてまとめる。
大枠の処理を上位のクラスで決めておき、具体的な処理の流れを下位のクラスに任せる設計パターン。
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()
}
実行時に処理を選択することができるような設計パターン。
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パターンも継承を使うか委譲を使う方は実装に任させれているので、どちらを使わないといけないということはない。
関連書籍