반응형

스트래티지 패턴

스트래티지 패턴(Strategy Pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로,
알고리즘을 정의하고 이를 캡슐화하여 동적으로 변경할 수 있는 패턴입니다.
이 패턴을 사용하면 알고리즘을 사용하는 클라이언트 코드와 분리하여 각각 독립적으로 변경하고 확장할 수 있습니다.
주로 전략을 변경해야 하는 경우나, 유사한 여러 알고리즘이 존재할 때 유용하게 쓰입니다.

스트래티지 패턴의 구성 요소:
1. 컨텍스트(Context): 전략 객체를 사용하는 역할로, 실제 사용자가 호출하는 메서드가 포함되어 있습니다.
2. 전략(Strategy): 알고리즘을 추상화한 인터페이스나 추상 클래스입니다.
3. 구체적인 전략(Concrete Strategy)L 실제 알고리즘을 구현한 클래스들 입니다.

스트래티지 패턴 예시 코드:

 

// 전략(Strategy) 인터페이스
public interface IAttackStrategy
{
    void Attack();
}

// 구체적인 전략(Concrete Strategy) 클래스들
public class MeleeAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("근접 공격을 수행합니다.");
    }
}

public class RangedAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("원거리 공격을 수행합니다.");
    }
}

// 컨텍스트(Context) 클래스
public class Character
{
    private IAttackStrategy attackStrategy;

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

    public void PerformAttack()
    {
        if (attackStrategy != null)
        {
            attackStrategy.Attack();
        }
    }
}

// 클라이언트 코드
class Program
{
    static void Main(string[] args)
    {
        Character warrior = new Character();
        Character archer = new Character();

        warrior.SetAttackStrategy(new MeleeAttackStrategy());
        archer.SetAttackStrategy(new RangedAttackStrategy());

        warrior.PerformAttack(); // Output: 근접 공격을 수행합니다.
        archer.PerformAttack();  // Output: 원거리 공격을 수행합니다.
    }
}

위의 예시 코드에서 IAttackStrategy 인터페이스는 알고리즘을 추상화합니다. 
MeleeAttackStrategy와 RangedAttackStrategy는 이 인터페이스를 구현하여 각각의 공격 방식을 
구체적으로 정의합니다. Character 클래스는 전략을 변경할 수 있는 메서드를 제공하고, 
클라이언트 코드에서 해당 전략을 설정하고 공격을 수행합니다.

스트래티지 패턴을 사용하면 새로운 공격 방식을 추가하거나 기존 공격 방식을 변경해야 할 때, 
기존 코드의 수정 없이 새로운 전략을 추가하거나 교체할 수 있습니다.

반응형