전략 패턴이란?
정의: 알고리즘(행동, 동작)을 각각의 클래스로 정의하고, 이들을 교체할 수 있도록 만드는 패턴.
목표: 행동을 컨텍스트 객체와 분리해, 실행 중에도 전략을 쉽게 변경할 수 있도록 함.
구성 요소 | 클래스 예시 | 역할 설명 |
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 > 디자인 패턴' 카테고리의 다른 글
싱글톤 패턴 (0) | 2025.05.02 |
---|---|
오브젝트 풀링 패턴 (0) | 2025.03.08 |