Invoker loading ...
① 클라이언트에서 커맨드 객체 생성
② setCommand()를 호출하여 인보커에 커맨드 객체를 저장
③ 나중에 클라이언트에서 인보커한테 그 명령을 실행시켜 달라는 요청을 함
public interface Command{
public void execute();
}
// 주문서에 해당하는 인터페이스. (백지 상태의 주문서)
public class PizzCookCommand implements Command{
// 주문서 인터페이스를 구현한 클래스
// 주문서에는 주문할 메뉴와, 어느 주방장이 요리 할 지에 대한 정보가 있다.
Cooker cooker; // 리시버 클래스(주방장)
public PizzCookCommand (Cooker cooker){
//생성자에 요리를 할 주방장 클래스에 대한 정보를 전달 받는다.
this.cooker= cooker;
}
public void execute(){
// execute()메소드에서는 리시버객체에 있는 pizzaCook()메소드를 호출한다.
// 웨이트리스가 "주문받아요"라고 외치면 (execute()가 호출되면) 주방장은 요리를 시작한다.
cooker.pizzaCook();
}
}
public class Waitress{
Command command;
public void setCommand(Command command){
//웨이트리스가 주문서를 받고
this.command = command;
}
public void call(){
//웨이트리스가 외친다. "주문 받아요!"
command.execute();
}
}
public class Store{
public static void main(String[] args){
Waitress waitress = new Waitress(); //웨이트리스를 생성
Cooker cooker = new Cooker(); //주방장을 생성
PizzCookCommand cookerCommand = new PizzCookCommand (cooker);
//주방장 정보를 생성자로 넘겨주면서 피자주문서 생성
waitress.setCommand(cookerCommand);
//웨이트리스가 주문서를 받음
waitress.call();
// "주문 받아요!"
}
}
** 커맨드 패턴의 정의 : 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수 도 있으며, 작업취소 기능도 지원 가능하다.