백엔드 스터디 Design pattterns command pattern

17
백백백 백백백 Design Patterns Command Pattern

Transcript of 백엔드 스터디 Design pattterns command pattern

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 메소드들을자동으로 순서대로실행하면된다 .