본문 바로가기

유니티/디자인 패턴

[Unity] 커맨드 패턴 (Command Pattern)

반응형

커맨드 패턴이란?

이 디자인 패턴은 어떠한 요청을 캡슐화하고 분리해서 실행할 수 있도록  하는 행동 패턴 중 하나이다.

 

커맨드 패턴 구조

 


왜 사용하는 것일까?

커맨드 패턴은 사용하기에 조금 복잡할 수 있으나, SOLID원칙을 잘 고수하며 설계할 수 있는 디자인패턴이다.

 

커맨드 패턴은 다음과 같은 장점이 있다.

장점

  1. 유지 보수 편리 : 새로운 기능을 추가하거나 제외하기 편리하다.
  2. 유연성 : 객체를 재사용(상속)하거나 교체하기 편리하다.
  3. 캡슐화 : 내부 구현을 숨기므로 객체간의 결합도를 낮춘다.
  4. 책임 분리 : 각 객체의 요청과 실행을 분리하여 책임을 명확히 한다.

단점

  1. 코드 복잡성 : 모든 객체를 커맨드 패턴으로 설계할 경우 지나치게 많은 클래스가 생성되어 코드가 복잡해질 수 있다.
  2. 성능 저하 : 대부분의 요청을 객체(클래스)로 처리하기 때문에 성능이 저하된다.

어떻게 사용할까?

커맨드 패턴을 사용하기 위해서는 요청과 실행을 분리해야 함을 기억해야 한다.

이때 요청과 실행은 인터페이스를 사용해서 느슨한 결합으로 이어준다.

 

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(요청 부분)이 확실히 분리되어 있다는 점에서 시기적절하게 사용할만한 가치가 있다.

반응형