프로그래밍/DesignPattern

커맨드 패턴 II

모지사바하 2007. 7. 20. 15:48

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();
    // "주문 받아요!"
  }
}

** 커맨드 패턴의 정의 : 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수 도 있으며, 작업취소 기능도 지원 가능하다.