Java/Design Pattern

[헤드퍼스트 디자인 패턴] 6. 커맨드 패턴

noahkim_ 2024. 12. 17. 00:37

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 커맨드 패턴

  • 요청 내용 캡슐화
    • 객체를 서로 다른 요청 내역에 따라 매개변수화 할 수 있음

 

요소
  • Receiver: 실제 작업을 수행하는 객체
  • Command: 작업을 캡슐화
  • Invoker: 작업 실행을 요청하는 객체

 

장점
  • 작업을 요청하는 쪽과 작업을 처리하는 쪽을 분리할 수 있음

 

2. 리모컨

리모컨 (Receiver)

public class RemoteControl {
    Command[] onCommands, offCommands;
    Command undoCommand;
    
    public RemoteControl() {
    	onCommands = new Command[7];
        offCommands = new Command[7];
        
        Command noCommand = new NoCommand();
        for (int i = 0; i < onCommands.length; i++) { onCommands[i] = offCommands[i] = noCommand; }

        undoCommand = noCommand;
    }
    
    public void setCommand(int slot, Command onCommand, Command offCommand) {
    	onCommands[slot] = onCommand;
        offCommands[slot] = offCommand;
    }
        
    public void onButtonWasPushed(int slot) { 
    	onCommands[slot].execute();
        undoCommand = onCommands[slot];
    }
    
    public void offButtonWasPushed(int slot) { 
    	offCommands[slot].execute();
        undoCommand = offCommands[slot];
    }
    
    public void undoButtonWasPushed() { undoCommand.undo(); }
}

 

 

명령 (Command)

public interface Command {
    void execute();
    void undo();
}
  • 명령 내용 캡슐화

 

public class LightOnCommand implements Command {
    Light light;
    
    public LightOnCommand(Light light) { this.light = light; }

    public void execute() { light.on(); }
    public void undo() { light.off(); }    	        
}
execute()
  • 명령을 처리함
  • invoker의 행동이 실행됨

 

undo()
  • 명령을 롤백함

 

기기 (Invoker)

on()

 

 

3. 활용

작업 큐

  • 요청을 큐에 저장 가능

 

호출자와 수신자 간의 분리
  • 유연하고 확장 가능한 설계 가능

 

행동 복구 가능
  • 작업 취소 기능을 사용할 수 있음
  • 메서드
    • store(): 작업의 히스토리를 디스크에 기록 (직렬화)
    • load(): 애플리케이션이 재시작되면, 저장된 히스토리를 역직렬화하여 다시 불러옴
    • execute(): 불러온 작업 히스토리를 순서대로 실행하여 애플리케이션을 복구