커맨드 패턴
커멘드 패턴은 하나의 객체를 통해 여러 객체들에 명령(Command)을 해야 할 때 사용되는 패턴이다. 커멘드 패턴을 사용하면 요청을 캡슐화해서 커멘드 객체가 명령을 해야하는 객체들에 대한 의존성을 느슨하게 만들 수 있다.
이 말이 무슨 말일까? 커멘드 패턴을 사용하지 않으면 여러 객체들에 명령(Command)를 하기 위해서는 명령을 하는 객체(커멘드 객체)가 명령을 받는 객체들을 알아야 한다. 예를 들어 집 안의 조명을 제어하는 LightController 클래스가 있다고 해보자. LightController는 제조사가 다른 조명들(MainLight, SubLight, BedRoomLight)에 대한 제어를 한다. LightController는 조명을 제어하기 위해 각 조명을 제어하는 메서드를 가지고 있어야 한다.
하지만, 이렇게 클래스를 설계하면 LightController는 많은 객체와 의존성을 갖는 슈퍼 객체가 되어버리며, 제어해야되는 조명이 늘어날 수록 LightController는 비대해진다. 만약 조명을 끄는 메서드도 추가하고 조명의 밝기 단계도 조절해야 한다면? 끔직한 슈퍼 객체가 탄생한다.
위 방식은 처리해야되는 전등(Light)이 많아질 수록 메서드를 각각 다 정의해야 된다는 문제가 있다. 또한 모든 메서드들이 특정 구현체에 의존하고 있기 때문에 LightController가 전등(Light)을 조작하기 위해 직접 전등의 메서드를 조작해야 한다.
커멘드 패턴에서의 객체 조작
커멘드 패턴에서는 이를 해결하기 위해 이러한 커멘드(요청)를 커멘드 객체로 캡슐화 해서 커멘드 객체에서 하는 일을 신경쓰지 않고 메서드를 수행하도록 한다. 다른 객체에 해야 되는 명령들은 Command 객체를 구현하는 클래스에서 정의한다.
위 그림2와 같이 Command가 만들어지면 LightController는 해당 Command를 수행하는 executeCommand 메서드 하나로 모든 Light 들을 조작할 수 있게 된다.
정리
Command 패턴을 사용하면 여러 객체에 명령을 하기 위해 모든 객체들에 대해 의존성을 가질 필요가 없게 된다. 단순히 Command 객체의 execute 메서드만으로 모든 객체들의 제어가 가능해진다.