디자인 패턴 [Design Pattern]

커맨드 패턴

브랑제리 2021. 6. 9. 23:08
  • 메서드 호출을 캡슐화
  • 요청을 하는 객체와 그 요청을 수행하는 객체를 분리할 수 있다.

예제

  • Player라는 객체가 존재한다고 한다.
  • Player는 Attack, Run, Jump 행위를 할 수 있다.
  • 위를 커맨드 패턴으로 구현 해 보자!

Player 클래스는 대략 이렇다.

public class Player
{
    public void Attack()
    {
        Debug.Log("Attack");
    }

    public void Run()
    {
        Debug.Log("Run");
    }

    public void Jump()
    {
        Debug.Log("Jump");
    }
}

ICommand로 공통된 interface를 가지도록 한다.

public interface ICommand
{
    void Excute();
}

Attack, Run, Jump에 대응되는 Command를 구현한다.

public class AttackCommand : ICommand
{
    private Player _player;
    public AttackCommand(Player player)
    {
        _player = player;
    }
    public void Excute()
    {
        _player.Attack();
    }
}

public class RunCommand : ICommand
{
    private Player _player;
    public RunCommand(Player player)
    {
        _player = player;
    }
    public void Excute()
    {
        _player.Run();
    }
}

public class JumpCommand : ICommand
{
    private Player _player;
    public JumpCommand(Player player)
    {
        _player = player;
    }
    public void Excute()
    {
        _player.Jump();
    }
}

테스트 하는 코드를 작성하자!

public class CommandTest : MonoBehaviour
{
    private ICommand _attackCommand;
    private ICommand _runCommand;
    private ICommand _jumpCommand;

    private Player _player;

    void Start()
    {
        _player = new Player();

        _attackCommand = new AttackCommand(_player);
        _runCommand = new RunCommand(_player);
        _jumpCommand = new JumpCommand(_player);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            _attackCommand.Excute();
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            _runCommand.Excute();
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            _jumpCommand.Excute();
        }
    }
}
반응형

'디자인 패턴 [Design Pattern]' 카테고리의 다른 글

디자인 패턴 공부 시작  (1) 2021.06.10
경량 패턴  (0) 2021.06.09