커맨드 패턴을 쓰면 작업을 요청하는 쪽과 그 작업을 처리하는 쪽을 분리할 수 있어요.
커맨드 객체를 추가해서 커맨드 객체는 틍정 작업 요청을 캡슐화해줍니다.
설명이 어려우니 일단 코드부터 봐볼까요?
//커맨드 인터페이스
public interface Command {
void execute();
}
//조명을 켤 때 필요한 커맨드 클래스
public class LightOnCommand implements Command {
Light light;
public void lightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
//인보커(Invoker)
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
//제어할 명령을 설정하는 메소드
public void setCommand(Command command){
slot = command;
}
//버튼을 누르면 해당 메소드 호출
public void buttonWasPressed() {
slot.execute();
}
}
public static void main(String[] args) {
//remote 변수가 인보커(Invoker) 역할
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
//커맨드 객체를 인보커에 전달
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
커맨드 패턴을 사용하면
- 요청 내역을 객체로 캡슐화해서
- 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있습니다.
- 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다.
제 식으로 간단하게 요약하면 어떤 클래스의 어떤 행동이던 특정 인터페이스에 할당해서 사용한다고 이해해도 될 것 같아요.
public class MacroCommand implements Command{
Command[] commands;
public MacroCommand(Command[] commands){
this.commands = commands;
}
public void execute() {
for (Command command : commands) {
command.execute();
}
}
}
이렇게 여러 커맨드들을 하나의 매크로 커맨드로 묶어서 사용하는 방법도 있어요.
출처
에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022
'Design Pattern' 카테고리의 다른 글
퍼사드 패턴 (Facade Pattern) (1) | 2023.10.24 |
---|---|
어댑터 패턴 (Adapter Pattern) (0) | 2023.10.23 |
싱글턴 패턴(Singleton Pattern) (2) | 2023.09.25 |
팩토리 패턴(Factory Pattern) (0) | 2023.09.14 |
데코레이터 패턴(Decorator Pattern) (2) | 2023.09.11 |