[디자인 패턴] 커맨드 패턴
필요성
client코드에서 다양한 객체들을 호출을 하게 되는 상황을 가정해보자. 객체들을 행동들은 제각기 상이할 것이고 client코드는 이러한 상이한 객체들의 행동들의 순서 및 메소드들에 결합이 강하게 되는 상황이 발생할 것이다. 이러한 예시는 OS에서 프로세스를 실행시키는 상황에서 볼 수 있다. 프로세스들에서 실행시키고자 하는 동작은 각기 다를 것이지만 커널은 이러한 프로세스를 호출해서 실행시키는 것을 반복해야한다. 그렇다고 커널들이 모든 프로세스들의 동작을 알고 있다는 것은 현실상 불가능하다.
따라서 행동을 하는 코드와 호출을 하는 코드 사이의 결합도를 낮출 방법이 필요하고 이러한 경우에 사용하는 것이 커맨드 패턴이다
커맨드 패턴
커맨드 패턴이란 객체의 행동을 캡슐화 하여 이를 호출하는 객체로 하여금 호출대상이 되는 객체의 내부 구조를 몰라도 행동을 호출할 수 있게 하는 패턴이다.
커맨드 객체에는 다음 4가지 용어가 등장한다.
- 리시버 : 우리가 수행하고자 하는 행동을 정의하는 객체
- 커맨드 : 리시버와 리시버의 행동을 위한 정보를 가지고 있는 객체이다. 외부로는 execute라는 메소드를 오픈하고 있다. 이러한 excute함수를 호출하면 정의된 리시버들의 행동이 동작을 하게 된다.
- 인보커 : 커맨드 객체를 정의하고 가지고 있는 객체로써 client의 요청을 command로 변환하고 execute를 호출하여 요청을 처리한다.
- 클라이언트 : 리시버를 정의하고 커맨드 객체를 만들어 인보커에게 커맨드 객체를 넘겨주는 역할을 한다.
초기화 방식
1. Client가 Receiver객체를 생성한다.
2. Command 객체에 Receiver객체를 set시킨다.
3. Invoker 객체에 Command객체를 set시킨다.
작동 방식
1. Client는 Invoker를 호출한다.
2. Invoker는 자신에게 등록된 Command들의 execute를 실행시킨다.
3. Command의 내부의 Reciever들의 action이 실행된다.
구현
https://github.com/RicardoKim/DesignPattern-Go-/tree/main/command_pattern
커맨드 패턴의 장점
- 확장성: 새로운 Command를 추가하기 쉬워 확장성이 뛰어남.
- 재사용성과 분리: 요청을 발생시키는 클라이언트와 요청을 수행하는 리시버가 분리되어 있어, 코드의 재사용성이 증가하고, 유지 보수가 용이함.
- 명령 기록 및 취소: 실행된 명령을 기록하고, 이를 통해 명령의 취소나 재실행 같은 추가적인 기능을 쉽게 구현할 수 있습니다.