1. Command Pattern이란 ?
- 요청을 요청에 대한 모든 정보가 포함된 객체로 변환해서 활용하는 패턴
- Undo 기능을 쉽게 구현 할 수 있음
- 실행될 기능(요청)과 실행 객체의 분리가 가능하다.
2. 사용 이유
- 기능 실행 객체와 요청을 분리
- 실행 취소 기능 구현
- 명령 저장 용이
- 확장성이 뛰어남
이런 구조라고 생각하면 된다.
3. 활용 사례 (Unity)
- GUI 버튼 이벤트 처리 : 버튼 클릭 시 특정 동작을 실행하는 기능을 캡슐화해 쉽게 추가 가능
- Undo 기능 : 플레이어의 행동을 기록하고 이전 상태로복원
- 작업 예약 시스템 : 특정 시간이나 조건 후 작업 실행
- 매크로 기능 구현 : 여러 개의 명령을 하나로 묶어 실행
4. 장단점
- 기능과 요청의 분리
- 실행취소와 재실행
- 뛰어난 확장성
- 지연 실행 가능
- 클래스 수 증가 : 모든 명령마다 새로운 클래스 사용
5. 예시 코드
다음은 예시 코드이다.
// 1. Command 인터페이스 정의
interface Command {
void execute(); // 실행 메서드
void undo(); // 실행 취소 메서드 (옵션)
}
// 2. Receiver (실제 기능을 수행하는 객체)
class Light {
public void turnOn() {
System.out.println("💡 전등이 켜졌습니다.");
}
public void turnOff() {
System.out.println("💡 전등이 꺼졌습니다.");
}
}
// 3. ConcreteCommand (실제 명령을 수행하는 클래스)
class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
@Override
public void undo() {
light.turnOff();
}
}
// 4. Invoker (커맨드를 실행하는 객체)
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
public void pressUndo() {
command.undo();
}
}
// 5. 실행 예제
public class CommandPatternExample {
public static void main(String[] args) {
Light light = new Light();
Command lightOn = new LightOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(lightOn);
// 버튼 누르기
remote.pressButton(); // 💡 전등이 켜졌습니다.
// 실행 취소(Undo)
remote.pressUndo(); // 💡 전등이 꺼졌습니다.
}
}
즉 커맨드 패턴은, 하나의 Invoker가 SetCommand 등을 이용해 실행할 명령(캡슐화된)을 계속 바꾸며 실행하는 것이다.
각 커맨드는 특정 리시버를 참조로 갖고 있고, excute가 호출되면 내부적으로 리시버의 기능을 실행하는 구조다.
Invoker는 단순히 실행 요청을 위임하고, 실제 작업은 Receiver가 한다.
만일 매개 변수가 필요하다면, Command 생성자(구체적인) 에서 매개 변수를 선언해 줄 수 도 있고,
매개 변수가 계속해서 변화해야 한다면 execute()에 매개 변수를 넘기는 방식도 있다.
'개념공부' 카테고리의 다른 글
생성자(Constructor) (0) | 2025.02.18 |
---|---|
Thread (0) | 2025.02.16 |
클로저(Closure) (0) | 2025.02.12 |
Unity Event System (0) | 2025.01.25 |
디자인 패턴 : 비지터 패턴 (Visitor Pattern) (0) | 2025.01.10 |