Skip to content

Command Pattern

Glory Day edited this page Jul 18, 2022 · 7 revisions

About

실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스로 설계하는 패턴. 즉 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용할 때 유용하다.

UML Class

UML_Class_1

커맨드 패턴 UML 클래스


실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 Invorker 클래스와 실제 기능을 실행하는 Receiver 클래스 사이의 의존성을 제거한다. 따라서 실행될 기능의 변경에도 Receiver 클래스를 수정없이 그대로 사용할 수 있도록 해준다.

  • Command
    • 실행될 기능에 대한 인터페이스
    • 실행될 기능을 execute() 메소드로 선언
    • 실행된 기능을 되돌리는 undo() 메소드를 추가할 수 있다.
  • ConcreteCommand
    • 실제로 실행되는 기능을 구현
    • 즉, Command 인터페이스를 구현하는 클래스
  • Invoker
    • 기능의 실행을 요청하는 호출자 클래스
  • Receiver
    • ConcreteCommand에서 execute() 메소드를 구현할 때 필요한 클래스
    • 즉, ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스

Example

어느 회사에서 개발 중인 최신형 리모컨 시제품이 있다. 이 리모컨에는 프로그래밍이 가능한 7개의 ON/Off 버튼이 있고, 작업 취소 버튼도 있다. 또한 조명, 욕조, 오디오 등 여러가지 장비를 제어할 수 있는 클래스들도 있다.

Problem

UML_Class_1

제어해야 하는 객체의 UML 클래스


위 제공된 클래스들을 보면 공통적인 인터페이스가 있지 않고, 이런 클래스가 더 추가될 수 있다. 만약 리모컨의 성능이 별로 좋지 않아 몇가지 간단한 요청만 할 수 있는 경우에는 다음 문제가 발생할 수 있다.

  • 제어해야 하는 객체들의 기능들이 동일하지 않아 만약 다른 기능을 실행하게 하는 경우에는 기존의 코드(기존 리모컨의 기능)를 수정해야 함므로 OCP애 위반이 된다.
  • 어떤 버튼을 누를 때 다른 기능이 나오게 할 경우, 새로운 기능이 추가될 때 마다 리모컨의 기능을 수정해야 함으로 재사용하기 어려워진다.

Solution

UML_Class_1

커맨드 패턴 UML 클래스


Code

Clone this wiki locally