디자인패턴 / / 2022. 11. 17. 01:06

커맨드 패턴 (Command Patter)

커맨드패턴은 전체적인 맥락에서 명렁어 버튼과 같다

커맨드패턴이란

커맨드 패턴의 핵심은 명령을 요청/수행하는 객체를 분리하고 이를 매개변수화 하는 캡슐화에 있다.
명령을 호출하는 Invoker, 명령을 수행하는 Receiver, 명령을 전달하는 Command로 나뉜다.

다이어그램

Command 인터페이스를 구현하는 ConcreteCommand 객체를 통해 구체적인 행위를 수행하는 Receiver 클래스의 행위를 사용한다.
(Receiver 클래스는 Invoker가 캡슐화할 명령일 뿐, 패턴구성에 있어 중요한 것은 아니다. 다른말로 ConcreteCommand 클래스에서 명령을 처리해도 무방하다. 일부 도서나 사이트에서는 이를 Smart Command Pattern이라 부른다)

Invoker 클래스는 내부의 필드를 통해 Command 객체를 가져와 객체에게 명령 수행을 요청한다.

Java Swing에서 특정액션을 정의하고 싶을때 AbstractAction 클래스를 상속하여 actionPerformed() 메소드를 구현하도록 되어있다. 이 actionPerformed() 메소드에는 액션이 수행될때 실행될 Receiver 코드가 들어간다.

이 액션은 Swing 내에서 사용되는 모든 컴포넌트에 매개변수화가 가능하다. 버튼, 드롭다운 메뉴 등 다양한 Invoker에 지정이 가능하다.

// AbstractAction 클래스는 Action 인터페이스를 구현하고 있다.
Action action = new ConcreteAction(name, icon, component);

// 버튼말고도 어떤 컴포넌트이든 Invoker 역할이 가능하다
JButton hello = new JButton(action);

...

public class ConcreteAction extends AbstractAction {
  ...
  @Override
  public void actionPerformed(ActionEvent e) {
    // Receiver 코드가 수행되거나, 바로 코드를 적을 수 있다
  }
}

이렇게 보면 기존의 전략패턴과 매우 흡사하다. 전략패턴 역시 위의 상황에서 Composite를 통해 Action을 수정가능하기 때문이다.
전략패턴은 하나의 기능에 대해서 여러 전략을 선택하는 1:N 형태지만, 커맨드패턴은 여러 기능에 대해서 여러 전략을 선택하는 N:M 형태의 차이라고 한다.

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

어댑터 패턴 (Adapter Pattern)  (0) 2022.11.18
데코레이터 패턴(Decorator Pattern)  (0) 2022.10.21
옵저버 패턴 (Observer Pattern)  (2) 2022.10.19
전략 패턴 (Strategy Pattern)  (0) 2022.09.15
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유