-
[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.java1234567package command;public interface Command {public void execute();}cs Switch.java
123456789101112131415161718package 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.java1234567891011121314package 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.java1234567891011121314151617package command;public class ShutDownCommand implements Command {private Computer computer;public ShutDownCommand(Computer computer) {this.computer = computer;}public void execute() {computer.shutDown();}}cs RestartCommand.java1234567891011121314151617package command;public class RestartCommand implements Command {private Computer computer;public RestartCommand(Computer computer) {this.computer = computer;}public void execute() {computer.restart();}}cs CommandMain.java1234567891011121314151617181920212223package 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 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 전략(Strategy) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 메멘토(Memento) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 상태(State) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 옵저버(Observer) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 중재자(Mediator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴 (0) 2015.06.13