목차
전략 패턴
전략 패턴(Strategy Pattern)은 객체지향 디자인 패턴 중 하나입니다.
이 패턴은 알고리즘을 캡슐화하여 상황에 따라 알고리즘을 쉽게 교체할 수 있도록 합니다.
유니티에서 C#을 사용하여 전략 패턴을 구현할 때, 주로 인터페이스, 추상 클래스, 그리고 구체적인 구현 클래스를 사용합니다.
전략 패턴은 상태 패턴과 아주 유사합니다. 사실 큰 차이점은 없고 사용하는 목적과 사용 방식에 따라 다를 뿐이죠.
전략 패턴과 상태 패턴의 차이점
상태 패턴
•
목적 : 객체의 내부 상태에 따라 행동을 변경하려는 경우 사용합니다.
•
구조 : 상태 인터페이스와 구체적인 상태 클래스를 정의하며, 각 상태 클래스는 객체의 상태에 따른 행동을 구현합니다. 컨텍스트 클래스는 현재 상태를 참조하고, 상태가 변경될 때마다 상태 객체를 교체합니다.
전략 패턴
•
목적 : 알고리즘을 캡슐화하여 동적으로 교체하려는 경우 사용합니다.
•
구조 : 전략 인터페이스와 구체적인 전략 클래스를 정의하며, 각 전략 클래스는 다른 알고리즘 또는 행동을 구현합니다. 컨텍스트 클래스는 전략 객체를 참조하고, 필요에 따라 전략 객체를 교체합니다.
위의 구조를 보시면, 아시겠지만 구조는 완전히 동일합니다. 목적에 차이가 있을 뿐이죠. 그래서 전략 패턴의 장,단점도 상태 패턴과 완전히 동일합니다.
전략 패턴의 장,단점
전략 패턴의 장점 :
1.
알고리즘을 캡슐화하여 독립적으로 변경 및 확장이 가능합니다.
2.
알고리즘을 교체하면서도 클라이언트 코드 변경이 필요 없어 유지 보수성이 좋습니다.
3.
다형성을 활용하여 여러 전략을 동적으로 교체할 수 있습니다.
전략 패턴의 단점 :
1.
전략 클래스가 많아질 경우, 클래스 수가 많아져 관리가 어려울 수 있습니다.
2.
클라이언트가 적절한 전략을 선택하는 책임을 가지게 되어, 클라이언트 코드의 복잡성이 증가할 수 있습니다.
전략 패턴의 UML
아래는 전략 패턴의 UML입니다.
(상태 패턴과 완전히 동일한 구조라 구조에 대한 설명은 하지 않겠습니다.)
전략 패턴의 구현
public interface IStrategy
{
void ExecuteStrategy();
}
C#
복사
인터페이스 정의: 공통 작업에 대한 인터페이스를 정의합니다. 이 인터페이스는 모든 전략 클래스에서 구현되어야 합니다.
public class ConcreteStrategyA : IStrategy
{
public void ExecuteStrategy()
{
Debug.Log("Executing Strategy A");
}
}
public class ConcreteStrategyB : IStrategy
{
public void ExecuteStrategy()
{
Debug.Log("Executing Strategy B");
}
}
C#
복사
구체적인 전략 클래스 생성: 인터페이스를 구현한 여러 전략 클래스를 작성합니다. 이들 클래스는 서로 다른 알고리즘 또는 행동을 제공합니다.
public class Context
{
private IStrategy _strategy;
public Context(IStrategy strategy)
{
_strategy = strategy;
}
public void ChangeContext(IStrategy strategy)
{
_strategy = strategy;
}
public void ExecuteStrategy()
{
_strategy.ExecuteStrategy();
}
}
C#
복사
컨텍스트 클래스 생성 : 전략 객체를 사용하는 클래스를 정의합니다. 이 클래스는 IStrategy 인터페이스를 참조하는 변수를 가지며, 이를 통해 전략을 실행할 수 있습니다.
public class StrategyPatternExample : MonoBehaviour
{
void Start()
{
Context context = new Context(new ConcreteStrategyA());
context.ExecuteStrategy(); // Executes Strategy A
context = new Context(new ConcreteStrategyB());
context.ExecuteStrategy(); // Executes Strategy B
}
}
C#
복사
전략 변경 : 필요에 따라 컨텍스트 클래스를 사용하여 전략을 동적으로 변경할 수 있습니다.
위, Context 클래스의 ChangeContext를 이용하면, 됩니다.