커맨드 패턴이란?
이 디자인 패턴은 어떠한 요청을 캡슐화하고 분리해서 실행할 수 있도록 하는 행동 패턴 중 하나이다.
왜 사용하는 것일까?
커맨드 패턴은 사용하기에 조금 복잡할 수 있으나, SOLID원칙을 잘 고수하며 설계할 수 있는 디자인패턴이다.
커맨드 패턴은 다음과 같은 장점이 있다.
장점
- 유지 보수 편리 : 새로운 기능을 추가하거나 제외하기 편리하다.
- 유연성 : 객체를 재사용(상속)하거나 교체하기 편리하다.
- 캡슐화 : 내부 구현을 숨기므로 객체간의 결합도를 낮춘다.
- 책임 분리 : 각 객체의 요청과 실행을 분리하여 책임을 명확히 한다.
단점
- 코드 복잡성 : 모든 객체를 커맨드 패턴으로 설계할 경우 지나치게 많은 클래스가 생성되어 코드가 복잡해질 수 있다.
- 성능 저하 : 대부분의 요청을 객체(클래스)로 처리하기 때문에 성능이 저하된다.
어떻게 사용할까?
커맨드 패턴을 사용하기 위해서는 요청과 실행을 분리해야 함을 기억해야 한다.
이때 요청과 실행은 인터페이스를 사용해서 느슨한 결합으로 이어준다.
public interface ICommand
{
void Execute();
}
이 인터페이스는 요청을 할 때 참조되어 실행될 것이다.
이제 실행에 해당하는 부분이 필요하다.
public class Receiver
{
public void DoSomething()
{
// Receiver가 수행할 작업
}
}
편의상 Receiver 클래스로 작성하였으나, 어떠한 객체에서 실행될 코드가 이곳에 작성되면 된다.
우리는 이 Receiver 클래스의 DoSomething 함수를 ICommand를 사용해서 실행시키려고 한다.
아래는 이 두 가지를 연결하는 클래스이다.
public class ConcreteCommand : ICommand
{
private Receiver _receiver;
public ConcreteCommand(Receiver receiver)
{
_receiver = receiver;
}
public void Execute()
{
_receiver.DoSomething();
// Receiver의 메서드를 호출
}
}
ConcreteCommand는 ICommand를 상속받은 클래스이다. 이 클래스는 요청을 받고 실행으로 이어준다.
그리고 이 과정은 ICommand를 통해 느슨한 결합으로 실행된다. 의존성을 낮추었기 때문에 유지보수에 강하다.
우리는 이 ConcreteCommand 클래스를 다른 클래스에서 사용하면 된다.
커맨드 패턴은 인터페이스를 활용한 요청/실행 분리를 세 개의 스크립트로 나누어서 실행하고, 이 스크립트들은 서로 이어져있다. 결국 ICommand - Receiver - ConcreteCommand가 하나의 세트인셈이다.
따라서 코드의 양이 비대해질 수도 있지만, 각 Receiver(실행 부분), ICommand(요청 부분)이 확실히 분리되어 있다는 점에서 시기적절하게 사용할만한 가치가 있다.
'유니티 > 디자인 패턴' 카테고리의 다른 글
[Unity] 서비스 로케이터 패턴 (Service Locator Pattern) (0) | 2024.04.09 |
---|---|
[Unity] 널 객체 패턴 (Null Object Pattern) (1) | 2023.10.25 |
[Unity] 상태 패턴 (State Pattern) (0) | 2023.10.06 |
[Unity] 빌더 패턴 (Builder Pattern) (0) | 2023.10.05 |
[Unity] 옵저버 패턴 (Observer Pattern) (0) | 2022.05.03 |