Keito

© 2024 Keito

技術ブログとポートフォリオ

【Go】簡単なStrategyパターンのサンプルコード

更新日2025/3/13/(木) 12:38
タグ
Goデザインパターン

概要

Goで簡単Strategyパターンを実装。

内容はポケモンの攻撃方法をStrategyパターンを用いて動的に変更できるようなもの。

サンプルコード

package main import "fmt" // このインターフェースを使って異なる攻撃方法を実装する // ポケモンの攻撃方法はこのインターフェースを実装した内容によって決まる type AttackStrategy interface { Attack() string } // 物理攻撃(AttackStrategyインターフェースを実装) type PhysicalAttack struct{} func (pa *PhysicalAttack) Attack() string { return "Physical Attack!" } // 特殊攻撃(AttackStrategyインターフェースを実装) type SpecialAttack struct{} func (sa *SpecialAttack) Attack() string { return "Special Attack!" } // ポケモン構造体 // AttackStrategy を差し替えることで、攻撃方法を動的に変更できる type Pokemon struct { name string attack AttackStrategy } // ポケモンを生成するコンストラクタ func NewPokemon(name string, attack AttackStrategy) *Pokemon { return &Pokemon{ name: name, attack: attack, } } // ポケモンの攻撃を表示 func (p *Pokemon) PerformAttack() { fmt.Printf("%s uses: %s\n", p.name, p.attack.Attack()) } // ポケモンの攻撃方法を変更 func (p *Pokemon) ChangeStrategy(newStrategy AttackStrategy) { p.attack = newStrategy } func main() { // 物理攻撃を持つポケモン「ピカチュウ」を作成 pikachu := NewPokemon("Pikachu", &PhysicalAttack{}) pikachu.PerformAttack() // 特殊攻撃に変更 pikachu.ChangeStrategy(&SpecialAttack{}) pikachu.PerformAttack() } // 出力 // Pikachu uses: Physical Attack! // Pikachu uses: Special Attack!