개발
home

[디자인 패턴] 커맨드 패턴

Created
2022/03/12
Tags
Design Pattern
Command Pattern
2022-03-12 @이영훈

커맨드 패턴

명령을 추상화해서 객체로 다룹니다. 명령은 간단한 명령일수도 있고, 다른 오브젝트의 action을 발생시키는 명령일수도 있습니다.
이렇게 추상화하면 좋은 점은 명령들을 object처럼 관리할 수 있고, object를 모아두었다가 지정한 시간에 실행 가능하게 할수도 있습니다.

게임 캐릭터 예시

게임 캐릭터(카이사, Kaisa)가 있습니다. Kaisa에게는 기본 공격과 4개의 스킬 공격이 있습니다. (협곡 사랑해). 카이사에게 공격 명령은 KaisaAttackCommand 를 통해서 내리면 됩니다. 그리고 게임 유저 GameUser는 게임을 하면서 카이사에게 명령을 내립니다.
전체 다이어그램은 아래와 같습니다

게임 캐릭터 예시 구현

게임 캐릭터 카이사를 만듭니다. 기본 공격과 4개의 스킬 공격이 있습니다.
// 롤 카이사 public class Kaisa { // 키보드 a 입력: 평타 public void normalAttack() { System.out.println("A 공격. 평타 - 기본공격👊"); } // 키보드 q 입력: 이케시아 폭우 public void icathianRain() { System.out.println("Q 스킬. 이케시아 폭우 - 미사일🚀"); } // 키보드 w 입력: 공허추적자 public void voidSeeker() { System.out.println("W 스킬. 공허추적자 - 레이저⚡️"); } // 키보드 e 입력: 고속 충전 public void supercharger() { System.out.println("E 스킬. 고속 충전 - 공격 속도🔥"); } // 키보드 r 입력: 사냥본능 public void killerInstinct() { System.out.println("R 스킬. 사냥본능 - 순간 이동💥"); } }
Java
복사
게임 캐릭터들의 공격 명령(command) 인터페이스 입니다.
이 인터페이스를 상속하여 다양한 게임 캐릭터에게 공격 명령을 내릴 수 있습니다.
public interface AttackCommand { public void attack(); }
Java
복사
위의 인터페이스를 구현하여 카이사에게 공격 명령을 내리는 클래스를 만듭니다.
public class KaisaAttackCommand implements AttackCommand { private final Kaisa kaisa; private final AQWER keyboardInput; public KaisaAttackCommand(Kaisa kaisa, AQWER keyboardInput) { this.kaisa = kaisa; this.keyboardInput = keyboardInput; } @Override public void attack() { switch (keyboardInput) { case A: kaisa.normalAttack(); break; case Q: kaisa.icathianRain(); break; case W: kaisa.voidSeeker(); break; case E: kaisa.supercharger(); break; case R: kaisa.killerInstinct(); break; } } } // 키보드 입력 A,Q,W,E,R을 enum으로 만듭니다 public enum AQWER { A, Q, W, E, R, }
Java
복사
게임 유저를 만듭니다. 명령을 내리는 invoker 역할을 합니다.
// invoker 역할입니다. public class GameUser { private final List<AttackCommand> attackCommands = new ArrayList<>(); public GameUser() { } public void addAttackCommand(AttackCommand attackCommand) { attackCommands.add(attackCommand); } public void executeAttackCommands() { for (AttackCommand attackCommand : attackCommands) { attackCommand.attack(); } } }
Java
복사
다 만들었습니다. 실행 해보겠습니다.
public class CommandPatternApplication { public static void main(String[] args) { Kaisa kaisa = new Kaisa(); GameUser faker = new GameUser(); // R-W-Q-동시에 평 faker.addAttackCommand(new KaisaAttackCommand(kaisa, AQWER.R)); faker.addAttackCommand(new KaisaAttackCommand(kaisa, AQWER.W)); faker.addAttackCommand(new KaisaAttackCommand(kaisa, AQWER.Q)); faker.addAttackCommand(new KaisaAttackCommand(kaisa, AQWER.A)); faker.executeAttackCommands(); /* * R 스킬. 사냥본능 - 순간 이동💥 * W 스킬. 공허추적자 - 레이저⚡️ * Q 스킬. 이케시아 폭우 - 미사일🚀 * A 공격. 평타 - 기본공격👊 * */ } }
Java
복사

Ref.