디자인 패턴 - 전략패턴

2024. 11. 11. 12:53카테고리 없음

전략패턴

행동을 캡슐화하여 동적으로 행위를 변경할 수 있도록 하는것이여서 다양한 기능들을 별도의 클래스에 정의하고, 필요에 따라 교체하거나 선택적으로 사용할 수 있다.

전략 패턴 구조

1. 전략 인터페이스: 공통 인터페이스를 정의하여 다양한 전략을 사용할 수 있도록 합니다.

2. 전략 구현체: 인터페이스를 구현한 구체적인 전략 클래스입니다.

3. 컨텍스트: 전략을 설정하고 실행하는 역할을 하는 클래스입니다.

4. 클라이언트: 특정 전략을 선택하고, 컨텍스트를 통해 전략을 실행합니다.

전략 패턴 예시 ( 무기 전략 패턴 )

1. 전략 인터페이스 정의

캐릭터가 사용할 다양한 무기 동작을 정의

// 전략 - 무기 행동을 정의한 인터페이스
public interface IWeapon
{
    void Attack();
}

2. 구체적인 전략 구현체들

다양한 무기 전략을 구체화하여 구현

// 무기 전략 구현체 - 검
public class Sword : IWeapon
{
    public void Attack()
    {
        Console.WriteLine("칼을 휘두르다");
    }
}

// 무기 전략 구현체 - 방패
public class Shield : IWeapon
{
    public void Attack()
    {
        Console.WriteLine("방패로 밀친다");
    }
}

// 무기 전략 구현체 - 석궁
public class Crossbow : IWeapon
{
    public void Attack()
    {
        Console.WriteLine("석궁을 발사하다");
    }
}

3. 컨텍스트 클래스 정의

캐릭터가 전략을 설정하고 실행할 수 있도록 하는 클래스

// 컨텍스트 - 무기 전략을 설정하고 실행
public class Character
{
    private IWeapon _weapon; // 전략 인터페이스를 합성

    // 전략을 설정하는 메서드
    public void SetWeapon(IWeapon weapon)
    {
        _weapon = weapon;
    }

    // 전략 실행 메서드
    public void PerformAttack()
    {
        if (_weapon != null)
        {
            _weapon.Attack();
        }
        else
        {
            Console.WriteLine("무기를 선택하지 않았습니다.");
        }
    }
}

4. 클라이언트 코드

클라이언트가 Character 클래스에 전략을 설정하고 호출

public class Program
{
    public static void Main(string[] args)
    {
        // 캐릭터 생성
        Character character = new Character();

        // 검으로 공격 전략 설정
        character.SetWeapon(new Sword());
        character.PerformAttack(); // 출력: "칼을 휘두르기"

        // 방패로 공격 전략 변경
        character.SetWeapon(new Shield());
        character.PerformAttack(); // 출력: "방패로 밀치기"

        // 석궁으로 공격 전략 변경
        character.SetWeapon(new Crossbow());
        character.PerformAttack(); // 출력: "석궁을 발사"
    }
}

전략 패턴 특징

유연성 : 전략을 쉽게 교체할 수 있다. 새로운 무기를 추가할 때 IWeapon을 구현하는 새로운 클래스만 만들면 된다.

코드 유지보수 : if-else 분기 없이 전략을 객체로 분리해 클린한 코드를 유지한다.

확장성 : if-else 분기 없이 다양한 무기 전략을 관리할 수 있어 코드가 간결해진다.