Top Banner
백백백 백백백 Design Patterns Command Pattern
17

백엔드 스터디 Design pattterns command pattern

Jan 22, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 백엔드 스터디 Design pattterns   command pattern

백엔드스터디Design Patterns

Command Pattern

Page 2: 백엔드 스터디 Design pattterns   command pattern

참고도서

Head First Design Patterns 자바객체지향디자인패턴

Page 3: 백엔드 스터디 Design pattterns   command pattern

● 만능버튼만들기● Command Pattern● 리모컨만들기● Null 객체● 커맨드패턴의활용

Page 4: 백엔드 스터디 Design pattterns   command pattern

만능버튼만들기 (1)

- 눌리면특정기능을수행하는버튼만들기- 버튼이눌렸을때램프의불이켜지는프로그램- 버튼을눌렀을때램프가켜지는대신다른기능을

실행하게하려면 ? 버튼을눌렀을때알람이시작되게하려면 ?

- 버튼을누르는동작에따라다른기능을실행하게하려면 ? 버튼을처음눌렀을땐램프를켜고 , 두번째눌렀을때는 알람을동작하게하려면 ?

Page 5: 백엔드 스터디 Design pattterns   command pattern

만능버튼만들기 (2)

- 버튼을눌렀을때램프가켜지는대신다른기능을 실행하게하려면 ? 버튼을눌렀을때알람이시작되게

하려면 ?- 기능을변경하려고기존 Button 클래스의코드를

수정하는것은 Open Close Principle(OCP, 기존의코드를 변경하지않고기능을추가 ) 에위배됨

Page 6: 백엔드 스터디 Design pattterns   command pattern

만능버튼만들기 (3)

- 버튼을누르는동작에따라다른기능을실행하게하려면 ? 버튼을처음눌렀을땐램프를켜고 , 두번째눌렀을때는 알람을동작하게하려면 ?

- 기능을변경하려고기존 Button 클래스의코드를 수정하는것은 Open Close Principle(OCP, 기존의코드를 변경하지않고기능을추가 ) 에위배됨

Page 7: 백엔드 스터디 Design pattterns   command pattern

만능버튼만들기해결책

- 새로운기능을추가하거나변경하더라도 Button 클래스를 그대로사용

- pressed 메소드에서구체적인기능 (램프켜기 , 알람울리기 ) 을직접구현하는대신 , 버튼을눌렀을때

실행될기능 을 Button 클래스 외부에서제공 받아캡슐화 하여 pressed 메소드에서호출하는방법사용

Page 8: 백엔드 스터디 Design pattterns   command pattern

Command Pattern(1)

- 커맨드패턴은이벤트가발생했을때실행될기능이 다양하면서도변경이필요한경우에이벤트를발생시키는

클래스를변경하지않고재사용하고자할때유용- 커맨드패턴은실행될기능을캡슐화함으로써기능의

실행을요구하는호출자 (invoker) 클래스와실제기능을 실행하는수신자 (Receiver) 클래스사이의의존성을

제거한다 . 따라서실행될기능의변경에도호출자 클래스를수정없이그래도사용할수있도록해준다 .

Page 9: 백엔드 스터디 Design pattterns   command pattern

Command Pattern(2)

- 매개변수를써서여러가지다른요구사항을집어넣을수있다 .

- 요청내역을큐에저장하거나로그로기록할수도있으며 , 작업취소기능도지원가능하다 .

- 커맨드패턴을제대로사용할수있으면메타커맨드패턴(Meta Command Pattern) 이라는것도어렵지않게구현

할수있다 .- 메타커맨드패턴을이용하면명령들로이루어진매크로

(Macro) 를만들어서여러개의명령의한번에실행할수있다 .

Page 10: 백엔드 스터디 Design pattterns   command pattern

Command Pattern(3)

- Command : 실행될기능에대한인터페이스 , 실행될 기능을 execute 메서드로선언함

- ConcreteCommand : 실제로실행되는기능을구현 , 즉 , Command 라는인터페이스를구현함

- Invoker : 기능의실행을요청하는호출자클래스- Receiver : ConcreteCommand 에서 execute 메서드를

구현할때필요한클래스 . 즉 ConcreteCommand 의 기능을실행하기위해사용하는수신자클래스

Page 11: 백엔드 스터디 Design pattterns   command pattern

Command Pattern 클래스다이어그램

Page 12: 백엔드 스터디 Design pattterns   command pattern

Command Pattern 순차다이어그램

Page 13: 백엔드 스터디 Design pattterns   command pattern

Command Pattern 순차다이어그램

1) 클라이언트가원하는커맨드객체를생성2) 생성된커맨드객체를 Invoker 객체에바인딩3) 나중에 Invoker 객체에서는바인딩된커맨드객체의

execute 메서드를호출4) execute 메소드는 Receiver 객체의 action 메소드를

호출하여원하는기능실행

Page 14: 백엔드 스터디 Design pattterns   command pattern

리모컨만들기

Page 15: 백엔드 스터디 Design pattterns   command pattern

Null Object

- 딱히리턴할객체는없지만클라이언트쪽에서 null 을 처리하지않도록하고싶을때널객체를활용 .

- 리모컨의경우 , 처음리모컨을가지고왔을때는아무 명령도할당되지않은상태이므로 , execute() 메소드가

호출됐을때아무일도하지않지만 , 빈자리를채우기 위한용도로 NoCommand 라는객체를집어넣어두면

편하다 .

Page 16: 백엔드 스터디 Design pattterns   command pattern

커맨트패턴의활용 - 요청을큐에저장하기

- 커맨드를이용하면 computation 의한부분 ( 리시버와 일련의행동 ) 을패키지로묶어서일급객체형태롤전달

하는것도가능 .- 어떤클라이언트애플리케이션에서커맨드객체를

생성하고나서한참후에도그컴퓨테이션을호출할수있다 .

- 스케줄러나스레드풀 , 작업큐와같은다양한용도에적용 할수있다 .

Page 17: 백엔드 스터디 Design pattterns   command pattern

커맨트패턴의활용 - 요청을로그에기록하기

- 커맨드패턴을사용하면 store() 와 load() 라는메소드를 추가하여어떤애플리케이션에서의모든행동을

기록해놨다가그애플리케이션이다운되었을경우 , 나중에그행동들을다시호출해서복구를할수있다 .

- 로그기록은어떤명령을실행하면서디스크에실행 히스토리를기록하며 , 애플리케이션이다운되면커맨드

객체를다시로딩하고 execute 메소드들을자동으로 순서대로실행하면된다 .