SlideShare a Scribd company logo
1 of 31
INDEX
1. COMMAND 패턴 소개
2. COMMAND 패턴 정의
3. UNDO COMMAND
• 본 PPT는 Design Patterns Study를 위해 작성되었습니다.
• Study에 사용한 교재는 한빛미디어에서 나온
• [Head First Desgin Patterns]을 사용하였습니다.
• Written by 서울시립대 이희태 For study with
NHN NEXT2기 조현호
서 울 시 립 대 이 희 태
안녕하십니까?
저희가 새로 개발한 홈 오토메이션 리모컨의 API 디자인을 의뢰하고자 합니
다. 저희 회사에서 개발 중인 최신형 리모컨 시제품을 동봉해 드리겠습니다.
이 리모컨에는 일곱 가지 프로그래밍이 가능한 슬롯과 각 슬롯에 대한
ON/OFF 스위치가 있습니다. 각 슬롯은 다양한 가정용 기기에 연결할 수 있
습니다. 리모컨에는 작업취소 버튼도 장착되어 있습니다.
그리고 조명, 팬, 욕조, 오디오를 비롯한 장비들을 제어하기 위한 용도로 다
양한 업체에서 공급받은 자바 클래스들을 CD에 동봉해서 보내드립니다. 각
슬롯을 한 가지 기기 또는 하나로 엮어 있는 일련의 기기들에 할당할 수 있도
록 리모컨을 프로그래밍하기 위한 API를 제작해주시길 부탁 드립니다.
여러분께서 설계하신 디자인을 하루 빨리 볼 수 있기를 기대하고 있겠습니
다. 건승을 기원합니다.
빌 “X – 10” 톰슨, CEO
디자인 의뢰가 들어왔네요.
동봉된 리모컨을 살펴봅시다.
1번 슬롯에 연결되는
가전제품 제어
2번 슬롯에 연결되는
가전제품 제어
. . .
버튼들이 쭉 나열된다.
7가지 프로그래밍이
가능한 슬롯. 각 슬롯
에 원하는 제품을 연
결한 후 우측의 버튼
으로 조작할 있다.
Undo 버튼 : 마지막으
로 누른 버튼에 대한
명령 취소
제어할 수 있는 제품
의 이름이 등록
CD에 동봉된 클래스들을 살펴보자.
on()
off()
dim()
CeilingLight
on()
off()
OutdoorLight
on()
off()
setInputChannel()
setVolume()
TV
on()
off()
setCD()
setDvd()
setRadio()
setVolume()
Stereo
up()
down()
lightOn()
lightOff()
GarageDoor
high()
medium()
low()
off()
getSpeed()
CeilingFan
setDuskTime()
setDawnTime()
manualOn()
manualOff()
GardenLight
on()
off()
Light
jetsOn()
jetsOff()
Circulate()
setTemperature()
Hottub
waterOn()
waterOff()
Sprinkler
openValue()
closeValue()
FaucetControl
리모컨 API 디자인 설계
지금 바로 위의 가전제품 클래스들을
리모컨에 부착하도록 설계하면 어떨까?
문제점
1. 바뀌는 부분을 따로 캡슐화하지 않았다.
2. 상위 클래스가 아닌 구체적인 클래스들에 의존하고 있다.
3. 리모컨에 부착하는 구체적인 가전제품 클래스들이 새로 추가,변경될
때마다 리모컨의 코드를 고쳐야 한다.
4. 가전제품에 따라 리모컨 on/off버튼에 해당되는 메소드 호출이 다 달
라야만 한다.
5. 리모컨에서 가전제품 클래스에 대해 정보은닉이 되고 있지 않는다.
즉,
리모컨의 버튼과 가전제품의 특정 기능(ex. On, off)들이 전혀
분리되어 있지 않다. Client에서 특정 작업 요청이 이루어질
때 그 요청 호출을 캡슐화할 필요가 있다.
Command Pattern
을 사용한다!
레스토랑에 잠깐 들려보자…
JAVA Restaurant
연어스테이크,
카바(cava)
createOrder() takeOrder()
OrderUp()
주문서
(Order객체)
makeSteak()
makeWine()
연어스테이크,
카바(cava)
웨이트리스와 요리사가 구분되어있다.
이 둘은 Order객체 – 주문서 – 를 통해서 소통할 뿐이다.
요리사는 요리에 필요한 정
보만 가지고 있다. 요리를 하
지 주문을 받지는 않는다.
웨이트리스는 주문서를 식사
를 준비시킨다.
요리를 하지 않는다.
exec
ute()
exec
ute()
Client Command
Command
Invoker
Receiver
create
CommandObject
()
Invoker.setCommand
(Command sth)
setComm
and()
execute()
action1()
action2()
action1()
action2() 의 결과물
JAVA Restaurant Command Pattern
손님 Client 객체
주문서 Command 객체
takeOrder() setCommand()
웨이트리스 Invoker 객체
orderUp() execute()
주방장 Receiver 객체
레스토랑과 커맨드패턴의 비교
COMMAND PATTERN이란?
Def : 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐
화할 수 있으며, 매개 변수를 써서 여러 가지 다른 요구
사항을 집어 넣을 수 있다. 또한 요청 내역을 큐에 저장
하거나 로그로 기록할 수도 있으며, 작업 취소 기능도 지
원 가능하다.
UML 다이어그램
+setCommand
()
커맨드 객체에게 Execute()
를 실행하도록 요청 <Interface>
매개변수로 command객체를 받음
ConcreteCommand를 생성한 후 그 객체에 특
정 Receiver를 넣어줌
구현된 Excetute()메소드에서는 receiver의 메
소드(Action())를 호출하여 요청된 작업을 수
행 (호출의 캡슐화)
command Interface
Receiver
Invoker
NoComman
dNoCommand가 없다면?
☞ NoCommand는 on/offButtonWasPushed() 메소드를 더 간단하게 만든
다.
setCommand()
public void setCommand(int slot, Command onCommand, Command offCommand)
- Invoker( = RemoteControl)의 각 slot에 concreteCommand객체를 등록하는 메소드
RemoteControlTest(1)
RemoteControlTest(2)
작업취소 (UNDO) 버튼?
바로 이전 상태로 되돌린다!
Interface에 undo() 메소드를 선언해준다.
concreteCommand객체에서 undo() 메소드를 구현한
다. On Command객체라면 -> off로, Off Command객
체라면 On으로 작업취소 명령을 정의해준다.
Undo()가 추가된 Command객체
Invoker
undoCommand객체를 멤버변수로 넣어주고…
여기에도 noCommand 대입
사용자가 버튼을 누르면 우선 해당 Command
를 실행한 뒤(=execute() 호출한 후), 바로 그
객체의 레퍼런스를 undoCommand 변수에 할
당해준다.
사용자가 undoButton을 누르면 현재 저장된
undoCommand객체의 undo()메소드를 호출한다.
그러면 마지막으로 했던 작업이 취소된다.
RemoteControlTest, Console 출력
livingRoomLightOn.execute()
livingRoomLightOff.execute()
livingRoomLightOff.undo()
livingRoomLightOff에서의 작업취소
Q/A
Q1. 항상 리시버가 필요한가요? 커맨드 객체에서 execute()를 구현해 버리면 안
되나요?
ans) 일반적으로 리시버에 있는 행동을 호출하는 “더미” 커맨드 객체를 만든다.
하지만 요구사항의 전부는 아니더라도 대부분을 요구하는 “스마트” 커맨드 객체를
만드는 경우도 자주 볼 수 있다. 물론 커맨드객체에서 대부분의 행동을 처리해도
된다. 하지만 그렇게 하면 여기에서 우리가 했던 수준으로 인보커와 리시버를 분리
시키는 것이 불가능해지고, 리시버를 이용해서 커맨드를 매개변수화하는것도 할
수 없다.
Q2. 작업 취소를 할 때 히스토리 기능은 어떻게 구현할 수 있나요? 즉, UNDO버튼
을 여러 번 누를 수 있도록 하려면 어떻게 해야 하나요?
ans) 간단하다. 앞에서는 undoCommand에 마지막으로 실행한 커맨드에 대한 레
퍼런스를 그냥 대입했는데, 여기서는 스택을 이용하여 이전에 실행한 커맨드를 순
서대로 저장하면 된다. 그리고 나서 사용자가 undo버튼을 누를 때마다 스택의 맨
위에서부터 항목을 꺼내서 undo() 메소드를 호출하기만 하면 된다.
Design pattern study 6 command pattern

More Related Content

Viewers also liked

Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Hyunho-Cho
 
Arquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerMarkus Christen
 
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber patternDaeMyung Kang
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1Daniel Lim
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2Daniel Lim
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015NAVER / MusicPlatform
 
Proxy pattern
Proxy patternProxy pattern
Proxy patternscor7910
 

Viewers also liked (12)

Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴
 
Arquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk Server
 
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber pattern
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
 
4. publish / subscribe
4. publish / subscribe4. publish / subscribe
4. publish / subscribe
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
 
Proxy pattern
Proxy patternProxy pattern
Proxy pattern
 

Similar to Design pattern study 6 command pattern

한글시계웍샵_SW
한글시계웍샵_SW한글시계웍샵_SW
한글시계웍샵_SW영광 송
 
한글시계웍샵_ SW
한글시계웍샵_ SW한글시계웍샵_ SW
한글시계웍샵_ SW영광 송
 
adios 2021 oct 유현식 발표자료
adios 2021 oct 유현식 발표자료adios 2021 oct 유현식 발표자료
adios 2021 oct 유현식 발표자료Hyun-sik Yoo
 
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
I os push:  세상에서 가장 간단한  날씨, 대기환경 엡I os push:  세상에서 가장 간단한  날씨, 대기환경 엡
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡HannaSungKim
 
자바 인터페이스 Java interface
자바 인터페이스 Java interface자바 인터페이스 Java interface
자바 인터페이스 Java interfaceJinhyun Sim
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversingYoungjun Chang
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기Daehee Kim
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니Lusain Kim
 
배푸 창의로봇 Sw교육 4. 아두이노 맛보기
배푸 창의로봇 Sw교육   4. 아두이노 맛보기배푸 창의로봇 Sw교육   4. 아두이노 맛보기
배푸 창의로봇 Sw교육 4. 아두이노 맛보기배로만쌤
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
Component configurator
Component configuratorComponent configurator
Component configuratorscor7910
 
Create App Easier With SVC Pattern - DroidKnights 2019 @Seoul
Create App Easier With SVC Pattern - DroidKnights 2019 @SeoulCreate App Easier With SVC Pattern - DroidKnights 2019 @Seoul
Create App Easier With SVC Pattern - DroidKnights 2019 @SeoulBansook Nam
 
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기라한사 아
 
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수Devgear
 
회사소개서(우리젠)
회사소개서(우리젠)회사소개서(우리젠)
회사소개서(우리젠)병일 손
 
11.dsd alarmed clock
11.dsd alarmed clock11.dsd alarmed clock
11.dsd alarmed clock호상 장
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental systemJaehoon Oh
 
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!Devgear
 
학교장리더십(피지컬컴퓨팅)
학교장리더십(피지컬컴퓨팅)학교장리더십(피지컬컴퓨팅)
학교장리더십(피지컬컴퓨팅)gongdigi24
 
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)Sung Woo Park
 

Similar to Design pattern study 6 command pattern (20)

한글시계웍샵_SW
한글시계웍샵_SW한글시계웍샵_SW
한글시계웍샵_SW
 
한글시계웍샵_ SW
한글시계웍샵_ SW한글시계웍샵_ SW
한글시계웍샵_ SW
 
adios 2021 oct 유현식 발표자료
adios 2021 oct 유현식 발표자료adios 2021 oct 유현식 발표자료
adios 2021 oct 유현식 발표자료
 
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
I os push:  세상에서 가장 간단한  날씨, 대기환경 엡I os push:  세상에서 가장 간단한  날씨, 대기환경 엡
I os push: 세상에서 가장 간단한 날씨, 대기환경 엡
 
자바 인터페이스 Java interface
자바 인터페이스 Java interface자바 인터페이스 Java interface
자바 인터페이스 Java interface
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversing
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
배푸 창의로봇 Sw교육 4. 아두이노 맛보기
배푸 창의로봇 Sw교육   4. 아두이노 맛보기배푸 창의로봇 Sw교육   4. 아두이노 맛보기
배푸 창의로봇 Sw교육 4. 아두이노 맛보기
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
Component configurator
Component configuratorComponent configurator
Component configurator
 
Create App Easier With SVC Pattern - DroidKnights 2019 @Seoul
Create App Easier With SVC Pattern - DroidKnights 2019 @SeoulCreate App Easier With SVC Pattern - DroidKnights 2019 @Seoul
Create App Easier With SVC Pattern - DroidKnights 2019 @Seoul
 
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
 
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수
RAD Studio XE7 DeepDive_VCL 자세히 살펴보기_김현수
 
회사소개서(우리젠)
회사소개서(우리젠)회사소개서(우리젠)
회사소개서(우리젠)
 
11.dsd alarmed clock
11.dsd alarmed clock11.dsd alarmed clock
11.dsd alarmed clock
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental system
 
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!
RAD Studio XE7 DeepDive: VCL 애플리케이션을 더 멋지게!
 
학교장리더십(피지컬컴퓨팅)
학교장리더십(피지컬컴퓨팅)학교장리더십(피지컬컴퓨팅)
학교장리더십(피지컬컴퓨팅)
 
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)
2016년 #implude 안드로이드 단기속성 - 3. 데이터를 담아주는 변수 & 자료형 (+스낵바)
 

Design pattern study 6 command pattern

  • 1.
  • 2. INDEX 1. COMMAND 패턴 소개 2. COMMAND 패턴 정의 3. UNDO COMMAND
  • 3. • 본 PPT는 Design Patterns Study를 위해 작성되었습니다. • Study에 사용한 교재는 한빛미디어에서 나온 • [Head First Desgin Patterns]을 사용하였습니다. • Written by 서울시립대 이희태 For study with NHN NEXT2기 조현호 서 울 시 립 대 이 희 태
  • 4.
  • 5. 안녕하십니까? 저희가 새로 개발한 홈 오토메이션 리모컨의 API 디자인을 의뢰하고자 합니 다. 저희 회사에서 개발 중인 최신형 리모컨 시제품을 동봉해 드리겠습니다. 이 리모컨에는 일곱 가지 프로그래밍이 가능한 슬롯과 각 슬롯에 대한 ON/OFF 스위치가 있습니다. 각 슬롯은 다양한 가정용 기기에 연결할 수 있 습니다. 리모컨에는 작업취소 버튼도 장착되어 있습니다. 그리고 조명, 팬, 욕조, 오디오를 비롯한 장비들을 제어하기 위한 용도로 다 양한 업체에서 공급받은 자바 클래스들을 CD에 동봉해서 보내드립니다. 각 슬롯을 한 가지 기기 또는 하나로 엮어 있는 일련의 기기들에 할당할 수 있도 록 리모컨을 프로그래밍하기 위한 API를 제작해주시길 부탁 드립니다. 여러분께서 설계하신 디자인을 하루 빨리 볼 수 있기를 기대하고 있겠습니 다. 건승을 기원합니다. 빌 “X – 10” 톰슨, CEO 디자인 의뢰가 들어왔네요.
  • 6. 동봉된 리모컨을 살펴봅시다. 1번 슬롯에 연결되는 가전제품 제어 2번 슬롯에 연결되는 가전제품 제어 . . . 버튼들이 쭉 나열된다. 7가지 프로그래밍이 가능한 슬롯. 각 슬롯 에 원하는 제품을 연 결한 후 우측의 버튼 으로 조작할 있다. Undo 버튼 : 마지막으 로 누른 버튼에 대한 명령 취소 제어할 수 있는 제품 의 이름이 등록
  • 7. CD에 동봉된 클래스들을 살펴보자. on() off() dim() CeilingLight on() off() OutdoorLight on() off() setInputChannel() setVolume() TV on() off() setCD() setDvd() setRadio() setVolume() Stereo up() down() lightOn() lightOff() GarageDoor high() medium() low() off() getSpeed() CeilingFan setDuskTime() setDawnTime() manualOn() manualOff() GardenLight on() off() Light jetsOn() jetsOff() Circulate() setTemperature() Hottub waterOn() waterOff() Sprinkler openValue() closeValue() FaucetControl
  • 8. 리모컨 API 디자인 설계 지금 바로 위의 가전제품 클래스들을 리모컨에 부착하도록 설계하면 어떨까? 문제점 1. 바뀌는 부분을 따로 캡슐화하지 않았다. 2. 상위 클래스가 아닌 구체적인 클래스들에 의존하고 있다. 3. 리모컨에 부착하는 구체적인 가전제품 클래스들이 새로 추가,변경될 때마다 리모컨의 코드를 고쳐야 한다. 4. 가전제품에 따라 리모컨 on/off버튼에 해당되는 메소드 호출이 다 달 라야만 한다. 5. 리모컨에서 가전제품 클래스에 대해 정보은닉이 되고 있지 않는다.
  • 9. 즉, 리모컨의 버튼과 가전제품의 특정 기능(ex. On, off)들이 전혀 분리되어 있지 않다. Client에서 특정 작업 요청이 이루어질 때 그 요청 호출을 캡슐화할 필요가 있다. Command Pattern 을 사용한다!
  • 12. 연어스테이크, 카바(cava) 웨이트리스와 요리사가 구분되어있다. 이 둘은 Order객체 – 주문서 – 를 통해서 소통할 뿐이다. 요리사는 요리에 필요한 정 보만 가지고 있다. 요리를 하 지 주문을 받지는 않는다. 웨이트리스는 주문서를 식사 를 준비시킨다. 요리를 하지 않는다.
  • 13.
  • 15. JAVA Restaurant Command Pattern 손님 Client 객체 주문서 Command 객체 takeOrder() setCommand() 웨이트리스 Invoker 객체 orderUp() execute() 주방장 Receiver 객체 레스토랑과 커맨드패턴의 비교
  • 16. COMMAND PATTERN이란? Def : 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐 화할 수 있으며, 매개 변수를 써서 여러 가지 다른 요구 사항을 집어 넣을 수 있다. 또한 요청 내역을 큐에 저장 하거나 로그로 기록할 수도 있으며, 작업 취소 기능도 지 원 가능하다.
  • 17. UML 다이어그램 +setCommand () 커맨드 객체에게 Execute() 를 실행하도록 요청 <Interface> 매개변수로 command객체를 받음 ConcreteCommand를 생성한 후 그 객체에 특 정 Receiver를 넣어줌 구현된 Excetute()메소드에서는 receiver의 메 소드(Action())를 호출하여 요청된 작업을 수 행 (호출의 캡슐화)
  • 21. NoComman dNoCommand가 없다면? ☞ NoCommand는 on/offButtonWasPushed() 메소드를 더 간단하게 만든 다.
  • 22. setCommand() public void setCommand(int slot, Command onCommand, Command offCommand) - Invoker( = RemoteControl)의 각 slot에 concreteCommand객체를 등록하는 메소드
  • 25.
  • 26. 작업취소 (UNDO) 버튼? 바로 이전 상태로 되돌린다!
  • 27. Interface에 undo() 메소드를 선언해준다. concreteCommand객체에서 undo() 메소드를 구현한 다. On Command객체라면 -> off로, Off Command객 체라면 On으로 작업취소 명령을 정의해준다. Undo()가 추가된 Command객체
  • 28. Invoker undoCommand객체를 멤버변수로 넣어주고… 여기에도 noCommand 대입 사용자가 버튼을 누르면 우선 해당 Command 를 실행한 뒤(=execute() 호출한 후), 바로 그 객체의 레퍼런스를 undoCommand 변수에 할 당해준다. 사용자가 undoButton을 누르면 현재 저장된 undoCommand객체의 undo()메소드를 호출한다. 그러면 마지막으로 했던 작업이 취소된다.
  • 30. Q/A Q1. 항상 리시버가 필요한가요? 커맨드 객체에서 execute()를 구현해 버리면 안 되나요? ans) 일반적으로 리시버에 있는 행동을 호출하는 “더미” 커맨드 객체를 만든다. 하지만 요구사항의 전부는 아니더라도 대부분을 요구하는 “스마트” 커맨드 객체를 만드는 경우도 자주 볼 수 있다. 물론 커맨드객체에서 대부분의 행동을 처리해도 된다. 하지만 그렇게 하면 여기에서 우리가 했던 수준으로 인보커와 리시버를 분리 시키는 것이 불가능해지고, 리시버를 이용해서 커맨드를 매개변수화하는것도 할 수 없다. Q2. 작업 취소를 할 때 히스토리 기능은 어떻게 구현할 수 있나요? 즉, UNDO버튼 을 여러 번 누를 수 있도록 하려면 어떻게 해야 하나요? ans) 간단하다. 앞에서는 undoCommand에 마지막으로 실행한 커맨드에 대한 레 퍼런스를 그냥 대입했는데, 여기서는 스택을 이용하여 이전에 실행한 커맨드를 순 서대로 저장하면 된다. 그리고 나서 사용자가 undo버튼을 누를 때마다 스택의 맨 위에서부터 항목을 꺼내서 undo() 메소드를 호출하기만 하면 된다.