ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 커멘드(Command) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:52

    Pattern #18  커멘드 패턴




     서비스를 호출할 때 융통성을 높이려고 사용 (ex: undo Operation)




     패턴 요약 

      - 오퍼레이션을 클래스로 정의



     

     동기

      

     PDA’s GUI System 개발 프로젝트에 참여한 당신이 맡은 업무는 window main-menu 부분의 설계이다. 각 application은 mainmenu를

    가지고 있고, main-menu의 각 menu 들은 여러 개의 menu-item 을 가 지 고 있 다 . 사용자가 특정 menu-item 을 선택하면 해당 menu-item에 연동된 기능이 수행된다. 당신은 어떤 식으로 설계할 것 인가?

     

     




     



     어플리케이션 모델링 




     





     어플리케이션 모델링2 

     - 기능요청(예: '문서열기') 자체를 객체화 - Command
     - 기능요청을 원하는 각 객체에 해당 Command 객체 연결
     - 기능 요청을 원하는 각 객체가 선택될 때 연결된 Command 객체 실행 - commandExecute()








     

     Command class hierarchy 

     1) PasteCommand: 현 위치에 Clipboard 내용 붙여 넣기 => 다른 객체(document)에 요청 보내기
     2) OpenCommand: 문서열기 => 몇 개의 연산 조합으로 기능 수행
     









     Command class hierarchy 

     3) MacroCommand: 다른 Command 객체들을 연속 실행







     의도 

      - Encapsulate a request as an object
      - 기능요청을 객체화함으로써, 동적으로 기능설정을 바꾸거나, 실행된 기능들을 기록하거나 실행된 작업들을 재복구 시킬 수 있다.

     별칭

      - Action, Transaction






     적용범위

      - MenuItem 객체의 경우처럼, 객체에 수행되어야 할 행위(acion)를 동적으로 설정할 때
      - 작업 수행을 요청한 시점과 실제 작업이 수행되어야 할 시점을 다르게 할 필요가 있을 때
      - Undo 기능을 지원하고자 할 때
      - System의 기능수행 정도를 기록하고 싶을 때 => 각 Command 객체들이 수행될 때 마다 자신의 기록을 남김
      - 기본적인 행위들을 조합하여 더욱 복잡한 행위를 실핼하고자 할 때 => MacroCommand 사용
     

     결과

      - 작업 수행을 요청하는 객체와 실제 작업을 수행하는 객체를 분리한다.
      - 작업 요청 자체가 객체가 되기 때문에, 다른 객체처럼 '작업 요청' 자체를 저장하고 복구하고, 확장할 수 있다.  
      - 기본적인 행위들을 조합하여 더욱 복잡한 행위를 실행하고자 할 때
      - 기존 코드의 변경 없이 새로운 Command를 추가할 수 있다.







    예제.




    Command.java
    1
    2
    3
    4
    5
    6
    7
     
    package command;
     
    public interface Command {
        public void execute();
    }
     
    cs





    Switch.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    package command;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Switch {
        private List<Command> history = new ArrayList<Command>();
     
        public Switch() {
        }
     
        public void storeAndExecute(Command command) {
            this.history.add(command);
            command.execute();
        }
    }
     
    cs





    Computer.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    package command;
     
    public class Computer {
     
        public void shutDown() {
            System.out.println("Computer is shut down");
        }
     
        public void restart() {
            System.out.println("Computer is restarted");
        }
    }
     
    cs




    ShutDownCommand.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package command;
     
    public class ShutDownCommand implements Command {
     
        private Computer computer;
     
        public ShutDownCommand(Computer computer) {
            this.computer = computer;
        }
     
        public void execute() {
            computer.shutDown();
        }
     
    }
     
    cs




    RestartCommand.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package command;
     
    public class RestartCommand implements Command {
     
        private Computer computer;
     
        public RestartCommand(Computer computer) {
            this.computer = computer;
        }
     
        public void execute() {
            computer.restart();
        }
     
    }
     
    cs




    CommandMain.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package command;
     
    public class CommandMain {
     
        public static void main(String[] args) {
            Computer computer = new Computer();
            Command shutdown = new ShutDownCommand(computer);
            Command restart = new RestartCommand(computer);
     
            Switch s = new Switch();
     
            String str = "shutdown";
     
            if (str.equals("shutdown")) {
                s.storeAndExecute(shutdown);
            } else {
                s.storeAndExecute(restart);
            }
        }
     
    }
     
    cs















    댓글

Designed by Tistory.