SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
Command Pattern 
NHN NEXT 
김우진 
요구사항을 객체로 캡슐화 하는 패턴.
! 
시작
다음과 같은 리모콘의 S/W제작을 의뢰 받았습니다. 
에어컨 
TV 
오디오 
현관문 
거실 등
기능은 간단합니다. 
에어컨 
TV 
오디오 
현관문 
거실 등 1. 휠을 통한 가전제품 선택 
2. 버튼을 통한 On/Off
먼저, 가전제품과 직접적으로 연결하기로 합니다. 
에어컨 
TV 
오디오 
현관문 
거실 등 
public void airconButtonClick(Aircon aircon) { 
if(aircon.isOn()) { 
aircon.off(); 
} else { 
aircon.on(); 
} 
}
먼저, 가전제품과 직접적으로 연결하기로 합니다. 
에어컨 
TV 
오디오 
현관문 
거실 등 
public void audioButtonClick(Audio audio) { 
if(audio.isPlay()) { 
audio.stop(); 
} else { 
audio.play(); 
} 
}
하다보니까… 
TV 
오디오 
현관문 
거실등 
??? 
public void ???ButtonClick(??? ???) { 
if(???()) { 
???(); 
} else { 
???(); 
} 
} 
가전제품마다 메소드가 달라, 
새로운 기능이 추가되면, 
매번 추가해 주어야 합니다.
! 
그래서… 
하나의 메소드로, 여러 가전제품을 조작 할 수 없을까? 
remote.buttonClick(); 
remote.tvButtonClick(); 
remote.audioButtonClick(); 
remote.???ButtonClick();
! 
그래서 Command Pattern! 
요구사항을 객체로 캡슐화합니다. 
public interface Command { 
public void execute(); 
}
먼저, 가전제품 별로 Command객체를 구현합니다. 
에어컨 
TV 
오디오 
현관문 
거실 등 
public class AirconCommand implements Command { 
Aircon aircon; 
public airconCommand (Aircon aircon) { 
this.aircon = aircon; 
} 
! 
@Override 
public void execute() { 
if(aircon.isOn()) { 
aircon.off(); 
} else { 
aircon.on(); 
} 
} 
}
다시 기능을 볼까요? 
에어컨 
TV 
오디오 
현관문 
거실 등 
1. 휠을 통한 가전제품 선택 
! 
! 
2. 버튼을 통한 On/Off 
Command객체를 Remote객체에 넘깁니다. 
remote.setCommand(command); 
Remote객체에서 buttonClicked메소드를 실행합니다. 
remote.buttonClick();
Command객체를 Remote객체에 넘깁니다.(선택) 
// In main method 
// 객체 생성 
Remote remote = new Remote(); 
Aircon aircon = new Aircon(); 
AirconCommand ac = new AirconCommand(aircon); 
! 
// Command 객체 넘기기 
remote.setCommand(ac);
buttonClicked메소드를 실행합니다.(on/off) 
// 버튼 누르기 
remote.buttonClick();
다른 가전제품을 조작하려면? 
// 객체 생성 
tvCommand tc = new AirconCommand(tv); 
! 
// Command 객체 넘기기 
remote.setCommand(tc); 
! 
// 버튼 누르기 
remote.buttonClick();
참고 : Remote Class 
public class remoteTest { 
Command slot; 
public void setCommand(Command command) { 
slot = command; 
} 
public void buttonClick() { 
slot.execute(); 
} 
}
이제 새로운 제품이 추가되면, 
Command Interface를 구현하기만 하면 됩니다. 
참 쉽죠?
Class Diagram 
리모콘 
사용자 
가전제품
! 
Memento Pattern 복습
Memento Pattern 
이것만 알면 된다! 
1. 상태를 객체에 담아 저장한다.
Memento Pattern 
이것만 알면 된다! 
2. 상태객체를 통해 이전 상태로 돌아 갈 수 있다.
Memento Pattern 
이것만 알면 된다! 
3. 상태객체를 생성하는 곳과 저장하고 관리하는 곳이 다르다.
Memento Pattern 
Class Diagram 
생성, 변경 상태객체 저장, 관리
! 
Command Pattern + Memento Pattern
Command Pattern + Memento Pattern 
public interface Command { 
public void execute(); 
public void undo(); 
} 
먼저 execute()에 반대되는 undo()를 구현한다. 
ex) excute() - on() : undo() - off()
Command Pattern + Memento Pattern 
Main Method에서 List에 Command객체를 저장한다. 
List<Command> commandList = new ArrayList<Command>(); 
commandList.add(ac);
Command Pattern + Memento Pattern 
List에서 pop()하여 undo()를 실행하면, 이전상태로 돌아간다. 
commandList.pop().undo();
Command Pattern + Memento Pattern 
여기서 Command Object를 상태를 저장하는 
하나의 Memento라고 볼 수 있다.
! 
마지막으로
Command Pattern 
이것만 기억하자! 
Command Pattern은 요구사항을 객체화 하여, 
Client의 코드와 Receiver의 코드를 분리하는 Pattern 이다. 
Client 
(사용자) 
Receiver 
(가전제품) 
Invoker 
(리모콘) 
Command 객체 사용
! 
끝, Q & A
참고 
Head First Design Patterns - O’REILLY 
WIKIPEDIA

Contenu connexe

En vedette

데브루키 스터디 발표
데브루키 스터디 발표데브루키 스터디 발표
데브루키 스터디 발표dagri82
 
Adapter pattern 한진수
Adapter pattern 한진수Adapter pattern 한진수
Adapter pattern 한진수진수 한
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)hyun soomyung
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_patternHeo Seungwook
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장hyun soomyung
 
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
 
Oop design principle
Oop design principleOop design principle
Oop design principleRyan Park
 
소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화영기 김
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기JeongHun Byeon
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기Jiho Choi
 
The SOLID Principles Illustrated by Design Patterns
The SOLID Principles Illustrated by Design PatternsThe SOLID Principles Illustrated by Design Patterns
The SOLID Principles Illustrated by Design PatternsHayim Makabee
 
SOLID Principles and Design Patterns
SOLID Principles and Design PatternsSOLID Principles and Design Patterns
SOLID Principles and Design PatternsGanesh Samarthyam
 

En vedette (20)

misspattern
misspatternmisspattern
misspattern
 
Solid
SolidSolid
Solid
 
데브루키 스터디 발표
데브루키 스터디 발표데브루키 스터디 발표
데브루키 스터디 발표
 
Adapter pattern 한진수
Adapter pattern 한진수Adapter pattern 한진수
Adapter pattern 한진수
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_pattern
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장
 
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
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
Oop design principle
Oop design principleOop design principle
Oop design principle
 
GoF의 디자인 패턴
GoF의 디자인 패턴GoF의 디자인 패턴
GoF의 디자인 패턴
 
Mvc pattern
Mvc patternMvc pattern
Mvc pattern
 
소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
The SOLID Principles Illustrated by Design Patterns
The SOLID Principles Illustrated by Design PatternsThe SOLID Principles Illustrated by Design Patterns
The SOLID Principles Illustrated by Design Patterns
 
SOLID Principles and Design Patterns
SOLID Principles and Design PatternsSOLID Principles and Design Patterns
SOLID Principles and Design Patterns
 

Command pattern 김우진

  • 1. Command Pattern NHN NEXT 김우진 요구사항을 객체로 캡슐화 하는 패턴.
  • 3. 다음과 같은 리모콘의 S/W제작을 의뢰 받았습니다. 에어컨 TV 오디오 현관문 거실 등
  • 4. 기능은 간단합니다. 에어컨 TV 오디오 현관문 거실 등 1. 휠을 통한 가전제품 선택 2. 버튼을 통한 On/Off
  • 5. 먼저, 가전제품과 직접적으로 연결하기로 합니다. 에어컨 TV 오디오 현관문 거실 등 public void airconButtonClick(Aircon aircon) { if(aircon.isOn()) { aircon.off(); } else { aircon.on(); } }
  • 6. 먼저, 가전제품과 직접적으로 연결하기로 합니다. 에어컨 TV 오디오 현관문 거실 등 public void audioButtonClick(Audio audio) { if(audio.isPlay()) { audio.stop(); } else { audio.play(); } }
  • 7. 하다보니까… TV 오디오 현관문 거실등 ??? public void ???ButtonClick(??? ???) { if(???()) { ???(); } else { ???(); } } 가전제품마다 메소드가 달라, 새로운 기능이 추가되면, 매번 추가해 주어야 합니다.
  • 8. ! 그래서… 하나의 메소드로, 여러 가전제품을 조작 할 수 없을까? remote.buttonClick(); remote.tvButtonClick(); remote.audioButtonClick(); remote.???ButtonClick();
  • 9. ! 그래서 Command Pattern! 요구사항을 객체로 캡슐화합니다. public interface Command { public void execute(); }
  • 10. 먼저, 가전제품 별로 Command객체를 구현합니다. 에어컨 TV 오디오 현관문 거실 등 public class AirconCommand implements Command { Aircon aircon; public airconCommand (Aircon aircon) { this.aircon = aircon; } ! @Override public void execute() { if(aircon.isOn()) { aircon.off(); } else { aircon.on(); } } }
  • 11. 다시 기능을 볼까요? 에어컨 TV 오디오 현관문 거실 등 1. 휠을 통한 가전제품 선택 ! ! 2. 버튼을 통한 On/Off Command객체를 Remote객체에 넘깁니다. remote.setCommand(command); Remote객체에서 buttonClicked메소드를 실행합니다. remote.buttonClick();
  • 12. Command객체를 Remote객체에 넘깁니다.(선택) // In main method // 객체 생성 Remote remote = new Remote(); Aircon aircon = new Aircon(); AirconCommand ac = new AirconCommand(aircon); ! // Command 객체 넘기기 remote.setCommand(ac);
  • 13. buttonClicked메소드를 실행합니다.(on/off) // 버튼 누르기 remote.buttonClick();
  • 14. 다른 가전제품을 조작하려면? // 객체 생성 tvCommand tc = new AirconCommand(tv); ! // Command 객체 넘기기 remote.setCommand(tc); ! // 버튼 누르기 remote.buttonClick();
  • 15. 참고 : Remote Class public class remoteTest { Command slot; public void setCommand(Command command) { slot = command; } public void buttonClick() { slot.execute(); } }
  • 16. 이제 새로운 제품이 추가되면, Command Interface를 구현하기만 하면 됩니다. 참 쉽죠?
  • 17. Class Diagram 리모콘 사용자 가전제품
  • 19. Memento Pattern 이것만 알면 된다! 1. 상태를 객체에 담아 저장한다.
  • 20. Memento Pattern 이것만 알면 된다! 2. 상태객체를 통해 이전 상태로 돌아 갈 수 있다.
  • 21. Memento Pattern 이것만 알면 된다! 3. 상태객체를 생성하는 곳과 저장하고 관리하는 곳이 다르다.
  • 22. Memento Pattern Class Diagram 생성, 변경 상태객체 저장, 관리
  • 23. ! Command Pattern + Memento Pattern
  • 24. Command Pattern + Memento Pattern public interface Command { public void execute(); public void undo(); } 먼저 execute()에 반대되는 undo()를 구현한다. ex) excute() - on() : undo() - off()
  • 25. Command Pattern + Memento Pattern Main Method에서 List에 Command객체를 저장한다. List<Command> commandList = new ArrayList<Command>(); commandList.add(ac);
  • 26. Command Pattern + Memento Pattern List에서 pop()하여 undo()를 실행하면, 이전상태로 돌아간다. commandList.pop().undo();
  • 27. Command Pattern + Memento Pattern 여기서 Command Object를 상태를 저장하는 하나의 Memento라고 볼 수 있다.
  • 29. Command Pattern 이것만 기억하자! Command Pattern은 요구사항을 객체화 하여, Client의 코드와 Receiver의 코드를 분리하는 Pattern 이다. Client (사용자) Receiver (가전제품) Invoker (리모콘) Command 객체 사용
  • 30. ! 끝, Q & A
  • 31. 참고 Head First Design Patterns - O’REILLY WIKIPEDIA