728x90
반응형

이 글은 Head First에서 나온 Design Patterns 책을 보고 이해한 내용을 나름대로 정리한 내용입니다.

Stratagy pattern은 알고리즘 집합을 정의하고 각각 캡슐화 하여 교환해서 사용할 수 있도록 한 것이다.

스타크래프트 예제로 두 개의 알고리즘 집합을 정의 하려고 한다. 하나는 '공격'에 대한 알고리즘 집합이고, 다른 하나는 '이동'에 대한 알고리즘 집합이다.

두 개의 알고리즘 집합 :

  • IAttackBehavior (인터페이스)
  • IMoveBehavior (인터페이스)
public abstract class Unit
{
    // 모든 유닛은 '공격'과 '이동'이라는 두가지 행동이 가능함.
    private IAttackBehavior _attackBehavior;
    private IMoveBehavior _moveBehavior;

    public void SetAttackBehavior(IAttackBehavior attackBehavior)
    {
        _attackBehavior = attackBehavior;
    }
    public void SetMoveBehavior(IMoveBehavior moveBehavior)
    {
        _moveBehavior = moveBehavior;
    }
    public void PerformAttack()
    {
        _attackBehavior.Attack();
    }
    public void PerformMove()
    {
        _moveBehavior.Move();
    }
}

public interface IAttackBehavior
{
    void Attack();
}

public interface IMoveBehavior
{
    void Move();
}

각 집합은 인터페이스로 추상화하여 나중에 구체적인 알고리즘을 만들때 이 인터페이스들을 상속받도록 한다.

구체적인 행동(알고리즘) :

// 공격에 대한 구체적인 알고리즘 1. 원거리 공격
public class AttackFar : IAttackBehavior
{
    public void Attack()
    {
        Console.WriteLine("원거리 공격!!");
    }
}

// 공격에 대한 구체적인 알고리즘 2. 근거리 공격
public class AttackNear : IAttackBehavior
{
    public void Attack()
    {
        Console.WriteLine("근거리 공격!!");
    }
}

// 이동에 대한 구체적인 알고리즘 1. 땅에서 이동
public class MoveGround : IMoveBehavior
{
    public void Move()
    {
        Console.WriteLine("땅에서 이동");
    }
}

// 이동에 대한 구체적인 알고리즘 2. 하늘에서 이동
public class MoveSky : IMoveBehavior
{
    public void Move()
    {
        Console.WriteLine("하늘에서 이동");
    }
}

이제 유닛을 만들 준비가 다 되었다.
저글링과 뮤탈리스크를 만들어보자.

public class Zergling : Unit
{
    public Zergling()
    {
        // 저글링은 근거리 공격을 하고 땅에서 이동함.
        SetAttackBehavior(new AttackNear());
        SetMoveBehavior(new MoveGround());
    }
}

public class Mutalisk : Unit
{
    public Mutalisk()
    {
        // 뮤탈리스크는 원거리공격을하고 하늘에서 이동함.
        SetAttackBehavior(new AttackFar());
        SetMoveBehavior(new MoveSky());
    }
}

생성자에 '공격'과 '이동'에 대한 구체적인 행동을 할당해주어 태어나면서 구체적인 행동을 갖도록 했다.

이제 Main 함수와 실행 결과를 확인해보자.

class Program
{
    static void Main(string[] args)
    {
        // 저글링
        Zergling myZergling = new Zergling();
        myZergling.PerformMove();
        myZergling.PerformAttack();


        // 뮤탈리스크
        Mutalisk myMutalisk = new Mutalisk();            
        myMutalisk.PerformMove();
        myMutalisk.PerformAttack();

        // 뮤탈리스크가 갑자기 땅으로 이동하고싶어짐.
        Console.WriteLine("\n땅으로 이동하고싶다~");
        myMutalisk.SetMoveBehavior(new MoveGround());
        myMutalisk.PerformMove();
        myMutalisk.PerformAttack();
    }
}

지금까지 만든 프로그램을 Class Diagram으로 다시한 번 확인해보자.

stratagy 패턴을 사용하면 이렇게 알고리즘 집합을 추상화 함으로써 알고리즘을 동적으로 교환할 수 있도록 한다.

참고 자료: Head First - Design Pattern

728x90
반응형

+ Recent posts