🔥

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

2025/02/14に公開

概要

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!
GitHubで編集を提案

Discussion