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
복사