전략 패턴이란?

정의: 알고리즘(행동, 동작)을 각각의 클래스로 정의하고, 이들을 교체할 수 있도록 만드는 패턴.

목표: 행동을 컨텍스트 객체와 분리해, 실행 중에도 전략을 쉽게 변경할 수 있도록 함.

 

구성 요소 클래스 예시 역할 설명
Strategy IAttackStrategy 행동(공격)의 인터페이스 정의. 구체 전략을 위한 공통 틀 제공
ConcreteStrategy MeleeAttack, RangedAttack, MagicAttack 실제로 공격을 구현하는 클래스들
Context Enemy 전략을 사용하는 객체. 공격 전략을 저장하고 실행함
Client GameManager 전략을 설정해주는 역할 (전략 선택 및 컨텍스트에 주입)

 

IAttackStrategy – 전략 인터페이스

public interface IAttackStrategy
{
    void Attack();
}

역할

모든 공격 전략이 따라야 할 공통 메서드 정의

이 인터페이스를 기반으로 여러 공격 방식이 교체 가능해짐

 

MeleeAttack, RangedAttack, MagicAttack – 구체 전략 클래스들

public class MeleeAttack : IAttackStrategy
{
    public void Attack()
    {
        Debug.Log("근접 공격: 칼을 휘두릅니다.");
    }
}

public class RangedAttack : IAttackStrategy
{
    public void Attack()
    {
        Debug.Log("원거리 공격: 활을 쏩니다.");
    }
}

public class MagicAttack : IAttackStrategy
{
    public void Attack()
    {
        Debug.Log("마법 공격: 파이어볼을 발사합니다.");
    }
}

역할

각 클래스는 Attack() 메서드를 자기 방식대로 구현

외부에서 어떤 클래스가 사용되든, Attack()만 호출하면 내부 구현이 실행됨

새로운 전략(예: 폭탄 공격)을 추가하려면 클래스 하나만 더 만들면 됨 — OCP(Open/Closed Principle) 충족

 

Enemy – 컨텍스트 클래스 (전략을 사용하는 주체)

public class Enemy : MonoBehaviour
{
    private IAttackStrategy attackStrategy;

    public void SetAttackStrategy(IAttackStrategy strategy)
    {
        attackStrategy = strategy;
    }

    public void PerformAttack()
    {
        attackStrategy?.Attack();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            PerformAttack();
        }
    }
}

역할

외부에서 전달받은 전략(SetAttackStrategy)을 저장

PerformAttack()을 호출하면 현재 설정된 전략을 실행

클라이언트(예: GameManager)가 전략만 바꾸면 동작이 달라짐 → 컨텍스트는 바뀌지 않음

 

GameManager – 클라이언트 (전략을 정하는 역할)

public class GameManager : MonoBehaviour
{
    public Enemy enemy;

    void Start()
    {
        enemy.SetAttackStrategy(new MagicAttack()); // 원하는 전략 설정
    }
}

역할

전략을 선택하고 컨텍스트(Enemy)에 주입

전략 패턴의 장점은 여기서 발휘됨: 조건에 따라 전략을 바꾸기만 하면 됨

'Unity > 디자인 패턴' 카테고리의 다른 글

상태 패턴(FSM, HFSM)  (1) 2025.05.04
싱글톤 패턴  (0) 2025.05.02
오브젝트 풀링 패턴  (0) 2025.03.08

+ Recent posts