커맨드 패턴(Command Pattern) - 2

하루키·2024년 8월 6일

DesignPattern

목록 보기
7/7
post-thumbnail

💡 여러개의 Command를 하나의 Invoker 에 구현하기

→ 슬롯에 명령 할당 하기


💬 UML 및 동작 원리

✔ 리모트 컨트롤 UML

  • RemoteControl : 여러개의 Command를 가짐. on, off, undo 등을 list 형태로 관리

📃 코드

  • RemoteControl 코드
    public class RemoteControl {
    
        private static final int MAX_COMMANDS = 7;
        private List<Command> onCommands = new ArrayList<>(); // 커맨드 타입의 배열 1(on)
        private List<Command> offCommands = new ArrayList<>(); // 커맨드 타입의 배열 2(off)
        private Command undoCommand;
    
        public RemoteControl() {
            Command noCommand = new NoCommand();
            for (int i = 0; i < MAX_COMMANDS; i++) {
                onCommands.add(i, noCommand);
                offCommands.add(i, noCommand);
            }
        }
    
        public void setCommand(int slot, Command onCommand, Command offCommand) {
            onCommands.set(slot, onCommand);
            offCommands.set(slot, offCommand);
        }
    
        public void onButtonWasPushed(int slot) {
            onCommands.get(slot).execute();
        }
    
        public void offButtonWasPushed(int slot) {
            offCommands.get(slot).execute();
        }
    
        @Override
        public String toString() {
            StringBuilder buf = new StringBuilder();
            buf.append("\n------리모트 컨트롤------\n");
            for (int i = 0; i < MAX_COMMANDS; i++) {
                buf.append("[Slot ").append(i).append("]");
                buf.append(onCommands.get(i).getClass().getName()).append("   ");
                buf.append(offCommands.get(i).getClass().getName()).append("\n");
            }
            return buf.toString();
        }
    }

💡 Undo 기능 구현하기

Command 인터페이스에 undo() 메서드 추가 및 리모콘에 undoCommand 객체 추가

// 교재 p.253 참조


💡 매크로 기능 구현하기

MacroCommand 클래스 생성 후, Command 배열을 받아서 커맨드 실행

public void execute() {
 	for (int i = 0; i< commands.length; i++){
			command[i].execute();
 	}
}

📝 이외 활용방안

  • 활용 1. Queueing Request (작업 큐)
    Receiver와 일련의 액션을 묶어 Command 객체 형태로 작업 큐에 넣음
    작업 큐의 반대편에서는 스레드가 하나씩 Command 객체를 꺼내서 실행
    스레드 수에 따라서 작업 제어 가능
  • 활용 2. Logging Requests (로그)
    Command 객체를 파일 형태로 저장.
    오류 발생 시 다시 복구하여 Command 객체를 순서대로 실행
profile
코딩 못하는 개발자(진)

0개의 댓글