Design-Pattern

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

_hong 2023. 3. 13. 20:13

요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화 할 수 있다. 

이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다.

요청을 하는 객체와 요청을 수행하는 객체를 분리할 수 있다. (의존성 분리)

커맨드 패턴을 이용해서 스케쥴러나 스레드풀, 작업큐에 활용할 수 있다.

만약 명령을 실행하는 객체가 다수의 명령어를 실행해야 한다고 생각해보자.

Public void setLightOn(Light light){
	light.turnOn();
}

Public void setLightOn(Light light){
	light.turnOff();
}

Public void setAlarmOn(Alarm alarm){
	alarm.turnOn();
}

한 클래스 안에 실행을 하는 많은 객체들과의 의존성이 생기고 하나의 클래스안에 모든 메소드들이 만들어진다.

Light 객체를 기능을 변경하기 위해서 해당 클래스의 내용을 변경해야 된다. (Ocp 위반)

 

 

위와 같은 구성요소들로 요청 내역을 캡슐화하고 명령을 요청하는 객체와 실행하는 객체 사이에 의존성을 줄인다.

 

* 디자인 패턴 구현 주소

https://github.com/f-lab-edu/DesignPatternStudy/tree/main/app/src/main/java/com/example/designpatternstudy

구성요소 종류

- Command 

커맨드들의 인터페이스 

실행될 기능을 execute 메서드로 선언함

 

- ConcreteCommand 

구체화된 커맨드

execute() 명령어에 대한 구현을 한다.

 

- Invoker

명령을 요청하는 객체

인보커는 command 형태의 객체를 매개변수로 받고 execute() 메소드만 실행하면 된다.

 

- Receiver

실제 ConcreteCommand에서 기능을 실행하는 객체

위에선 light, alarm객체가 된다.

 

항상 리시버가 필요한가?

커맨드에 구현을 하게되면 없으면 인보커와 리시버를 분리하기 어렵다. 리시버를 커맨드로 매개변수화 할 수 없다.

 

 

Reference. 

1. 헤드 퍼스트 디자인 패턴

 

* 디자인 패턴 구현 깃허브

https://github.com/f-lab-edu/DesignPatternStudy/tree/main/app/src/main/java/com/example/designpatternstudy