top bar

글 목록

2014년 7월 5일 토요일

커맨드 패턴 (command pattern) 1

오늘 정리할 패턴은 유명한 '커맨드 패턴' 이다.

일다 요약하면 '요구사항의 캡슐화' 라고하는데..... 이해하기가 좀 어렵다.
하나하나 다시 정리해보자.

커맨드 패턴에 언급되는 객체는 역할에 따라 이름을 가지고있다.
바로 클라이언트(Client) 객체, 리시버(Receiver) 객체, 인보커(Invoker) 객체, 커맨드(Command) 객체 이다.

하나하나 설명하자면,

인보커 : 클라이언트가 이 인보커 객체에게 명령을 내리면, 커맨드 객체에게 특정 작업을 수행해 달라는 요청을 한다.

커맨드 : 인터페이스로서, 모든 커맨드 객체가 구현한다. 모든 명령은 execute 메서드 호출을 통해 수행되며, 이 메서드에서는 리시버에게 특정작업을 수행하라는 명령을 내리게 된다. 커맨드객체는 리시버 객체를 가지고 있으며, 따라서 execute메서드는 어떤 리시버이   냐에 따라서 구현이 달라질것이다.

리시버 : 리시버객체는 요구사항을 수행하기 위한 로직을 담고있는 객체이다.

클라이언트 : 리시버와 커맨드 객체를 생성한다. 생성된 리시버는 커맨드객체에 매개변수로 전달한다.

뭐 대략적인 명령의 흐름은 클라이언트 -> 인보커 -> 커맨드 -> 리시버 인듯하다. 결국은 실제로 로직을 수행하는 객체는 리시버인 것이다

아래는 이러한 객체들의 관계를 UML로 표현한 것이다.




클라이언트에는 Invoker, Receiver, Command 객체가 모두 생성된다. 먼저 리시버와 커맨드 객체를 생성하고, 요구사항이 모듈화된 리시버를 커맨드 객체에 매개변수로 넘긴다. 그리고 인보커 객체의 setCommand 메서드를 이용해 커맨드 객체를 전달하고, 클라이언트가 인보커객체를 통해서 특정 메서드를 호출하면 그 호출된 메서드에서 커맨드 객체의 execute가 호출되고, 또 execute 메서드에서 실제로 수행하려는 리시버 객체의 메서드가 최종적으로호출되는 그림이다.

이러한 구조의 장점은 무엇일까? 일단 커맨드객체의 핵심을 다시 정리하자면 "일련의 행동(Command)를 특정 리시버와 연결시킴으로써 요구사항을 캡슐화 한것" 이다.

따라서 실제 클라이언트로부터 명령을 받는 인보커는 커맨드객체에게 다시 명령을하는데, 커맨드 객체의 세부 구조나, 그 커맨드 객체가 가지고 있는 리시버가 무슨기능을 하는지, 어떤 로직으로 이루어져있는지 알필요가 전혀없다. 인보커로선 그저 커맨드객체의 execute메서드만을 호출하면 되는 것이다. 'Loose Coupling'이 실현되는 순간이다.

댓글 없음:

댓글 쓰기