커맨드 패턴
- 요청을 캡슐화하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴
- 요청을 처리하는 방법이 바뀌더라도 호출자의 코드는 변경되지 않는다.
※ 사용 이유
- 코딩을 할때 중복이 되는 비슷한 코드가 생성되는 문제를 해결하기 위해 사용
- 호출자(invoker)와 수신자(receiver)간의 관계가 타이트하게 엮여 있어서, 비효율적인 코딩이 됨
※ invoker : 커맨드를 참조하고 실행하는 역할
※ Command 인터페이스 : 여러 구체적인 커맨드들을 추상화 시켜놓은 인터페이스
button or myApp : invoker
light or game : receiver
※ 사용 예시
Command(interface)
- 우선 커맨드 인터페이스를 생성하여 execute()를 만들어둔다.
→ 예시를 들기위해 Command 인터페이스를 생성하였지만 자바에서 사용하는 Runnable인터페이스를 사용해도 무방함
LightOnCommand(class)
- 작업을 하기 위해서 필요한 모든 요소들이 다 들어와야 함
- 우리가 하는 단순한 예제에서는 light만 알고 있고, on을 호출한다거나 하는 동작을 알고 있으면 됨
LightOffCommand(class)
- invoker 쪽의 코드를 건드릴 필요가 없다.
※ 이렇게 코드를 구성하면 이미 만들어져 있는 Command 인터페이스를 얼마든지 재사용할 수 있다.
- 이전 코드의 경우는 구체적인 receiver에 해당하는 것을 직접사용하였기 때문에 모든 코드를 변경해야 했지만, 위와 같이 Command 패턴을 적용하면, Command만 변경하면 됨(변경의 여지가 축소됨)
※ 장점
- 기존의 코드를 변경하지 않고 새로운 커맨드를 만들 수 있다.(OCP, 개방 폐쇄의 원칙)
- 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않는다.(SRP, 단일 책임의 원칙)
- 커맨드 객체를 로킹, DB에 저장, 네트워크로 전송하는 등 다양한 방법으로 활용할 수도 있다.
※ 단점