1 커맨드 패턴(Command Pattern)
- 커맨드 패턴은 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴입니다.
2 문제 상황
- 텍스트 편집기 앱을 개발 중이며, 다양한 기능을 가진 버튼들이 있는 툴바 를 만들고 있다고 가정해봅시다.
Button
클래스를 만들어 툴바의 버튼과 다이얼로그의 버튼에 사용하려 합니다.
- 문제는 각 버튼마다 실행해야 할 기능이 다르다는 것입니다.
- 이 기능들을
Button
클래스의 하위 클래스로 만들면 어떻게 될까요?
- 기능별로 많은 하위 클래스가 필요하게 됩니다.
- 기능이 중복되는 경우가 있습니다. (예를 들어 툴바의 복사 버튼과 메뉴의 복사 메뉴 등)
- 이는 유지보수를 어렵게 만듭니다.
Button
클래스를 변경하면 모든 하위 클래스에 영향을 미칩니다.
3 해결책
- 커맨드 패턴은 GUI 객체에서 비즈니스 로직을 분리할 것을 제안합니다.
- 요청을 별도의
Command
클래스에 캡슐화합니다.
Command
클래스는 요청을 수행하는 데 필요한 정보를 모두 가지고 있습니다.
- GUI 객체는 적절한
Command
를 생성하고, 필요한 정보(수신자 객체, 실행 메서드 이름, 매개변수 등)를 전달하는 역할만 합니다.
- 이를 위해서는 모든
Command
클래스가 같은 인터페이스를 구현해야 합니다. 일반적으로 이 인터페이스는 execute
라는 단일 메서드만 가지고 있습니다.
- GUI 객체는
Command
인터페이스에만 의존하게 되므로, 새로운 기능을 추가하더라도 GUI 코드를 변경할 필요가 없습니다.
- 기능이 중복되는 경우에도 같은
Command
객체를 재사용할 수 있습니다.