실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
- 즉, 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유용.
- 행위패턴

| Command - 실행될 기능에 대한 인터페이스 - 실행될 기능을 execute 메서드로 선언 |
| ConcreteCommand - 실제로 실행되는 기능을 구현 - 즉, Command 라는 인터페이스를 구현 |
| Invoker - 기능의 실행을 요청하는 호출자 클래스 |
| Receiver - ConcreteCommand에서 execute 메서드를 구현할 때 필요한 클래스 - 즉, ConcreteCommand 의 기능을 실행하기 위해 사용하는 수신자 클래스 |
- 실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 호출자 클래스와 실제 기능을 실행하는 수신자 클래스 사이의 의존성을 제거한다.
- 따라서 실행될 기능의 변경에도 호출자 클래스를 수정없이 그대로 사용할 수 있도록 해준다.
| * 행위 패턴 : - 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴 - 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다. |
만약 커맨드 패턴을 사용하지 않으면 여러 객체들에 명령(Command)를 하기 위해서는 명령을 하는 객체가 명령을 받는 객체들을 알아야 한다.

다음과 같이 Controller 클래스가 오른쪽 클래스들을 제어하기 위해서는 각각 클래스마다 제어하는 메서드를 가지고 있어야 한다.
제어하는 대상이 늘어날수록 Controller 클래스는 비대해지게 된다.
커맨드 패턴을 사용하게 되면 다음과 같이 Interface를 override하고 호출하는 클래스에서는 따로 수정이 필요 없게 된다.

Interface Transport
public interface Transport {
void deliver();
}
Class Ship
public class Ship implements Transport{
@Override
public void deliver() {
System.out.println("배로 운송중...");
}
}
Class Truck
public class Truck implements Transport{
@Override
public void deliver() {
System.out.println("트럭으로 운송중...");
}
}
Main
public class Main {
public static void main(String[] args) {
Transport transport = new Ship();
Transport transport2 = new Truck();
transport.deliver();
transport2.deliver();
}
}

Command 패턴을 사용하면 여러 객체에 명령을 하기 위해 모든 객체들에 대해 의존성을 가질 필요가 없게 된다.
| [Design Pattern] Strategy Pattern (0) | 2023.03.23 |
|---|---|
| [Design Pattern] Abstract Factory Pattern (0) | 2023.03.22 |
| [Design Pattern] Factory Method Pattern (0) | 2023.03.19 |
| [Design Pattern] Observer Pattern (0) | 2023.03.18 |
| [Design Pattern] Template Method Pattern (0) | 2023.03.17 |