[디자인 패턴] 커맨드 패턴

[원본 링크]

커맨드 패턴은 일련의 명령(command)들을 정의하는 인터테이스를 두고, 인터페이스를 통해 명령을 실행하도록 하는 패턴이다.

생각보다 간단하다.
택시라는 클래스가 있다고 치자. 이 클래스는 run이라는 메서드를 갖는다.
그리고 사용자(여기선 main함수)는 이 run이라는 메서드를 통해서 뭔가 결과물을 원한다. image

image

이대로는 문제가 없을 것이다.
근데 갑자기 버스를 추가해야 할 일이 생긴다면? image

image 이쯤되면 뭔가 상속같은걸 활용해야할것처럼 보인다.
저 택시와 버스는 둘다 차니까 Car라는 추상클래스나 인터페이스를 정의하는 것도 방법일 것이다.

하지만 이건 커맨드 포스팅이니까...
그리고 그렇게 거창하게 카테고리를 나누는것보단 커맨드 패턴을 사용하는 것이 단순하고 가벼운 편이다.
게다가 만약 Car로 정의해놨는데 나중에 차가 아니면서 유사한 동작을 하는 객체가 추가된다면? 결함이 발생할 수도 있는 일이다.
커맨드패턴은 이런 고민 없이 특정 동작에만 집중할 수 있게 해준다.

여튼 저기서 커맨드 패턴을 적용하면, 저 run이라는 메서드를 커맨드 인터페이스로 추출하게 된다.
그리고 택시나 버스같은 실제 클래스들은 커맨드 인터페이스를 구현하는 것이다.

그러면 사용자 측에서는 커맨드 인터페이스만 갖고도 원활하게 주어진 기능을 사용할 수 있다. image

image 이러면 택시나 버스 외에도 기차나 화물차같은게 추가되더라도, 사용자의 코드나 인터페이스는 바뀌지 않는다.(폐쇄)
하지만 인터페이스만 따라서 잘 구현하면 아주 유연하게 확장도 잘 되므로,(개방)
개방폐쇄원칙을 아주 잘 지키는 기본 패턴 중 하나라 할 수 있다.

자바의 표준 라이브러리에서도 커맨드 패턴이 곧잘 활용되고 있는데, 대표적인 게 바로 Runnable 인터페이스다.
뭔가 어떤 동작을 요구하는 클래스를 받을때는 거의 Runnable 구현객체를 인자로 요구하지 않았던가? 가령, Thread 등을 생성할때 말이다.
그게 커맨드 패턴이었던 것이다.

그렇다.


참조
https://victorydntmd.tistory.com/m/295