728x90
명령어에 따라 행위를 구현할때, 명령어가 많아지면 조건문이 늘어나고, 가독성도 떨어지게 된다.
'copy', 'paste', 'cut'등의 명령어를 각각 구현하는 것보다, execute()라는 추상 메소드를 통해, 각 명령어에 따라 서브 클래스가 선택되어 실행되는 것이 효율적이다. overloading과 같은 추상화 개념을 사용한 것이다.
Command Pattern 이란?
작업 요청과 처리를 분리하는 방법 중 하나이다.
커맨드 패턴은 결과를 위한 계산 과정의 각 부분들을 캡슐화 시킬 수 있다.
연결해줘라는 작업 요청을 받고, 어떤 기계에 연결할지는 처리 담당에서 결정한다.
Command Pattern에서 사용되는 개념
1. 클라이언트 (Client) : 명령어를 입력받는다.
2. 커멘드 (Command) : 명령에 따른 행위가 들어있다.
- 수행해야할 작업들을 캡슐화하여 가지고 있으며, 그 작업들을 실행
- 공통 인터페이스를 상속받은 클래스로 구현
3. 발동자 (Invoker)
- 명령을 수신자에게 전달한다. 클라이언트에서 실행을 위임받아 여러 작업을 처리하는 객체
4. 수신자 (Receiver) : 행위를 전달받아 실행함.
매크로 커맨드
여러 작업을 순서대로 진행하려면, execute()안에 코드를 추가하여야했다.
매크로 커맨드는 여러개의 커맨드를 한데 묶어놓은 커맨드이다. 커맨드들을 순서대로 나열하여 한 곳에 저장한다. 리시버에게 전달되면, 리시버는 배열을 참조하여 순서대로 작업을 수행한다.
public class MacroCommand implements Command {
private List<Command> commands;
public MacroCommand() {
commands= new ArrayList<>();
}
public void addCommand(Command...commands) {
if(commands.length < 1) throw new NullPointerException();
for(Command c : commands) {
this.commands.add(c);
}
}
@Override
public void execute() {
if(commands.size()>0) {
commands.stream().forEach(c->c.execute());
}
}
}
728x90