티스토리 뷰

클래스가 일을 실행할 때에는 자신의 클래스나 다른 클래스의 메서드를 호출한다.

메서드를 호출한 결과는 객체의 상태에 반영되지만, 일의 이력은 어디에도 남지 않는다.

이 때 ‘이 일을 실행하시오' 라는 ‘명령'을 표현하는 클래스가 있으면 편리하다.

실행하고 싶은 일을 ‘메서드를 호출'하는 동적인 처리로 표현하는 것이 아닌, 명령을 나타내는 클래스의 인스턴스로 하나의 ‘물건'처럼 표현할 수 있기 때문이다.

이력을 관리하고 싶을 때에는 그 인스턴스의 집합을 관리하면 된다.

명령의 집합을 저장해 두면 같은 명령을 재실행할 수도 있고, 복수의 명령을 모아 새로운 명령으로 재이용할 수도 있다.

Command는 Event(사건)라고도 부른다.

‘이벤트 구동 프로그래밍'에서 사용되는 ‘이벤트'와 같은 의미다.

마우스를 클릭하거나 키를 누르는 등의 이벤트가 발생할 때, 그 사건을 일단 인스턴스라는 ‘물건'으로 해두고, 발생 순서에 따른 행렬로 나열한다.

그리고 나열해 놓은 이벤트를 순서대로 처리해 간다.

 

다음 링크는 커맨드 패턴의 예제 코드다.

 

GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드

Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Java-Design-Pattern development by creating an account on GitHub.

github.com

커맨드 패턴의 등장인물

Command(명령)의 역할 - Command

명령의 인터페이스(API)를 정의하는 역할

ConcreteCommand(구체적인 명령)의 역할 - MacroCommand, DrawCommand

Command 역할의 인터페이스(API)를 실제로 구현하고 있는 역할

Receiver(수신자)의 역할 - DrawCanvas

Command 역할이 명령을 실행할 때 대상이 되는 역할

명령을 받아들이는 수신자라고 불러도 된다.

Client(의뢰자)의 역할 - Main

ConcreteCommand 역할을 생성하고, 그 사이에 Receiver 역할을 할당한다.

Main 클래스는 마우스의 드래그에 맞추어서 DrawCommand의 인스턴스를 생성하지만, 그 사이에 Receiver 역할로 DrawCanvas의 인스턴스를 생성자에게 전달한다.

Invoker(기동자)의 역할 - Main, DrawCanvas

명령의 행동을 개시하는 역할

Command 역할에서 정의되는 인터페이스(API)를 호출하는 역할이 된다.

이 두 개의 클래스가 Command 인터페이스의 execute 메서드를 호출하고 있다.

명령이 가지고 있어야 할 정보

‘명령'에 어느 정도의 정보를 갖게 할지는 목적에 따라서 다르다.

DrawCommand 클래스에는 그림을 그리는 점의 위치라는 정보만을 가지게 했다.

점의 크기나 색, 형태 등의 정보는 가지고 있지 않다.

DrawCommand가 이벤트가 발생한 시간이라는 정보를 가지고 있다고 가정하면, 그림을 그리는 것만이 아니라 사용자의 마우스 동작의 완급을 재현할 수 있을지도 모른다.

그런데 DrawCommand 클래스는 그림그리는 대상을 나타내는 필드(drawable)도 가지고 있다.

예제 코드에서는 DrawCommand의 인스턴스는 하나뿐이고, 모든 그림 그리기는 여기에 대응해서 실행되기 때문에 이 drawable 필드는 별도 의미가 없다.

그러나 그림 그리기의 대상이 여러 개 존재하는 프로그램의 경우에는 이와 같은 필드가 도움이 된다.

ConcreteCommand 역할 자신이 Receiver 역할을 ‘알고 있기' 때문에, ConcreteCommand 역할을 누가 관리하고 누가 가지고 있어도 execute할 수 있다.

이력의 저장

예제 코드에서는 그림 그리기의 이력을 MacroCommand의 인스턴스로 표현했다.

이 인스턴스는 지금까지의 그림 그리기의 모든 정보를 가지고 있다.

이것은 이 인스턴스를 파일로 잘 저장해 두면 그림 그리기의 이력이 저장된다는 의미다.

관련 패턴

  • Compositer 패턴
  • Memento 패턴
  • Prototype 패턴

'JAVA > 디자인 패턴' 카테고리의 다른 글

프록시(Proxy) 패턴  (0) 2022.04.18
플라이웨이트(Flyweight) 패턴  (0) 2022.04.18
상태(State) 패턴  (0) 2022.04.18
메멘토(Memento) 패턴  (0) 2022.04.03
옵저버(Observer) 패턴  (0) 2022.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함