기록하는 개발자

7. Command Pattern 본문

3-2/고급객체지향프로그래밍(디자인패턴)

7. Command Pattern

밍맹030 2021. 1. 15. 14:10
728x90

문제

사용 객체의 API가 서로 다름

 

해결 방안

실행과 요청을 분리

 

목적

- 요구사항(요청, 명령)을 객체로 캡슐화 시킴

- 이를 이용해 다른 요구사항을 지닌 클라이언트를 매개변수화 시킬 수 있음.

- 요구사항을 큐에 넣거나 로그로 남길 수 있으며 작업 취소(undo) 기능 지원도 가능

 

결과

(작은)클래스가 많아지나, 객체 사용에 필요한 복잡성을 제거하고 감춘다(함수 이름이 동일해진다)

 

설계

*Decoupling : 요청과 실행을 분리

 

Command

 -Receiver를 알고 있고, Receiver의 method를 호출

 - Receiver의 method에서 사용되는 매개변수의 값들은 Command에 저장됨

 ex)Command, ConcreteCommand

 

Receiver

 - 실제 명령(command)수행

 

Invoker

 -요청을 받아 그것을 실행하기 위해 Command interface 연결.

 - Command interface만 알고 있으며, Command가 실제 어떻게 실행되는지 모른다.

 

Client

 -무엇을 요청할 지 결정하고, 요청 Command를 Invoker에 넘김

 

 

ex) Command 의 명령 : 교실을 청소해라

청소해 -> 바닥 닦는 사람을 바닥만 닦는다

          -> 칠판 당번은 칠판만 지운다 

 

*strategy는 동일 목적에 사용 방법이 다양함. ex)칠판 지우는 방법이 다양.

 

커맨드 객체

-일련의 행동을 특정 리시버와 연결시킴으로써 요구사항을 캡슐화 한것.

 

-행동과 리시버를 한 객체에 집어넣고, execute()라는 method 하나만 외부에 공개

   (excute 함수만 호출하면 내부에서 알아서 처리해주는 방식)

 

- 메소드 호출을 통해 리시버에서 일련의 작업들이 처리됨

 

-외부에서 볼 때에는 어떤 객체가 리시버 역할을 하는지,

  그 리시버에서 실제로 어떤일을 하는 지 알 수 없다.

 그냥 method execute()를 호출하면 요구 사항이 처리된다는 것만 알게 됨.

 

 

 

 

ex) Invoker는 특정 인터페이스만 구현되어있다면 

command 객체에서 실제로 어떤 일이 일어나는지 몰라도 된다.

728x90

'3-2 > 고급객체지향프로그래밍(디자인패턴)' 카테고리의 다른 글

9. Facade Pattern  (0) 2021.01.15
8. Adapter Pattern  (0) 2021.01.15
6. Singleton Pattern  (0) 2021.01.14
5. Factory Pattern  (0) 2021.01.14
4. Decorator Pattern+예제  (0) 2021.01.14