2025.02.16(일)
스탠다드 반에서 진행한 디자인 패턴 2번째 강의를 정리합니다.
Unity 6기 스탠다드 반에서 송지원 튜터님이 강의하신 디자인 패턴 강의를 바탕으로 작성한 글입니다.
이전 글: 디자인 패턴 정리: 싱글톤 패턴, 오브젝틑 풀 패턴, 전략 패턴, 상태 패턴
발행자 | 구독자 | 대응 방식 |
---|---|---|
1 | 1 | 함수 호출 |
1 | can be N | 옵저버 패턴 |
can be N | can be N | 이벤트 버스 패턴 |
1 발행자, N 구독자인 Pub-Sub 패턴
N 발행자, N 구독자인 Pub-Sub 패턴
행동을 객체화해서 복잡한 작업을 순차적으로 처리하거나 되돌릴 수 있게 만드는 패턴
❓ 왜 명령을 객체로 묶을까?
할 일들을 To-Do리스트로 만든다고 생각해보자. 이때, 우리는 자연스럽게 할 일들을 객체화할 생각을 하게 된다. 언제? 무엇을? 어디에서? 누구랑? 언제까지?와 같은 내용들을 묶으려고 하다보면, 행동과 관련된 정보를 객체로 묶고 이를 체계적으로 관리하는 것은 매우 좋은 해결책이 될 것이다.
명령 패턴의 주요 구성 요소는 다음과 같다.
// 1. Command 인터페이스 정의
public interface ICommand
{
void Execute();
void Undo();
}
// 2. Receiver (명령을 실행하는 실제 객체)
public class Player
{
public void Jump()
{
Debug.Log("Player Jumped!");
}
public void UndoJump()
{
Debug.Log("Jump Undone!");
}
}
// 3. ConcreteCommand (구체적인 명령)
public class JumpCommand : ICommand
{
private Player _player;
public JumpCommand(Player player)
{
_player = player;
}
public void Execute()
{
_player.Jump();
}
public void Undo()
{
_player.UndoJump();
}
}
// 4. Invoker (명령을 저장하고 실행)
public class CommandInvoker
{
private ICommand _command;
public void SetCommand(ICommand command)
{
_command = command;
}
public void ExecuteCommand()
{
_command?.Execute();
}
public void UndoCommand()
{
_command?.Undo();
}
}
// 5. Client (사용 예)
public class GameManager : MonoBehaviour
{
private CommandInvoker _invoker = new CommandInvoker();
private Player _player = new Player();
void Start()
{
ICommand jumpCommand = new JumpCommand(_player);
_invoker.SetCommand(jumpCommand);
// 버튼 클릭 시 실행
_invoker.ExecuteCommand(); // "Player Jumped!" 출력
_invoker.UndoCommand(); // "Jump Undone!" 출력
}
}