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
반응형
'IT노트 > C#' 카테고리의 다른 글
[C# 하루한개] 디자인 패턴 - 옵저버 패턴 (0) | 2022.01.08 |
---|---|
[C# 하루한개] 다형성 (객체 지향 언어의 4대 원칙) (0) | 2022.01.03 |
[C# 하루한개] 상속 (객체 지향 언어의 4대 원칙) (0) | 2022.01.02 |
[C# 하루한개] 추상화 (객체 지향 언어의 4대 원칙) (0) | 2022.01.01 |
[C# 하루한개] 캡슐화 (객체 지향 언어의 4대 원칙) (0) | 2021.12.31 |
[C# 하루한개] 클래스(Class) - 객체 지향 언어의 출발 (0) | 2021.12.30 |