はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】状態に応じてクラスの振る舞いを切り替えるStrategyパターンを学ぶ

はじめに

今回はアルゴリズムを切り替えるStrategyパターンについて紹介したいと思います。

f:id:hanaaaaaachiru:20210411222947p:plain
クラス図

概要

wikipediaには以下のように表記されていました。

Strategy パターン(ストラテジー -)は、コンピュータープログラミングの領域において、アルゴリズムを実行時に選択することができるデザインパターンである。

Strategy パターンは、アプリケーションで使用されるアルゴリズムを動的に切り替える必要がある際に有用である。Strategy パターンはアルゴリズムのセットを定義する方法を提供し、これらを交換可能にすることを目的としている。Strategy パターンにより、アルゴリズムを使用者から独立したまま様々に変化させることができるようになる。

登場人物

名前 意味
Strategy 戦略を利用するためのインターフェイス
ConcreteStrategy Strategyのインターフェイスを実装した役
Client Strategyを利用する役。Strategyのインスタンスを保持
f:id:hanaaaaaachiru:20210411222947p:plain
クラス図

このクラス図ではStrategyは抽象クラスとして定義されていますが、インターフェイスでもOKです。

実装例

public interface IStrategy
{
    void Execute();
}

public class ConcreteStrategyA : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("ConcreteStrategyA");
    }
}

public class ConcreteStrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("ConcreteStrategyB");
    }
}

public class Client
{
    private IStrategy _strategy;

    public Client(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void Execute()
    {
        _strategy.Execute();
    }
}

さいごに

仕組み自体はただ委譲(確か正式名称は転送?)してるだけなので簡単ですが、結構有用なデザインパターンだと思います。

ゲームでも、色々な種類の敵の思考ルーチンをStrategyパターンで実装するなんかも良いでしょう。

Clientが保持するStrategyのインスタンスの変更もランタイムでできますしね。

是非うまく活用してみてください。

ではまた。